11

我像这样绑定我的主干模型的更改事件。

this.model.on( "change", this.render, this );

有时我想获取模型的最新版本并强制渲染视图。所以我这样做

this.model.fetch();

不幸的是,model.fetch() 仅在新数据与先前存储在模型中的数据不同时才会触发更改事件。

如何在 fetch 完成时始终触发 this.render 回调,无论它是否触发更改事件?

在此先感谢您的帮助

4

4 回答 4

13

您可以使用$.ajax成功回调,但您也可以只侦听模型上的 Backbonesyncerror事件。sync成功调用服务器后error触发,调用服务器失败后触发。

this.model.on('sync', this.render, this);
this.model.on('error', this.handleError, this);
于 2013-02-17T22:46:06.037 回答
1

我不知道你的代码结构是什么,但是如果你在你的视图中获取你的模型,你可以使用这样的东西

var that = this;
this.model.fetch().done(function () {
    that.render();
});

否则,如果您在视图之外获取模型,您可以将您的承诺传递给您的视图并制作类似的东西

var promise = model.fetch();
// other code here
var view = new View({
    model: model,
    promise: promise
});

并在您的视图中,例如在初始化

View = Backbone.View.extend({
    initialize: function(){
        this.options.promise.done(function () {
            // your code here
        });
    }
});
于 2015-01-27T21:09:41.443 回答
1

fetch方法可以选择接受成功和错误回调;最简单的解决方案是将您的视图render放在成功回调中。您也可以使用返回的 jqXHR 承诺,但如果 AJAX 会成功(每个 jQuery)但模型初始化失败,那么这种用法可能会出现问题。

于 2013-02-17T06:29:28.803 回答
1

这个解决方案怎么样:

// emit fetch:error, fetch:success, fetch:complete, and fetch:start events
fetch: function(options) {
  var _this = this;

  options = options || {};

  var error = options.error;
  var success = options.success;
  var complete = options.complete;

  options.error = function(xhr, textStatus, errorThrown) {
    _this.trigger('fetch:error');
    if (error) error(xhr, textStatus, errorThrown);
  };

  options.success = function(resp) {
    _this.trigger('fetch:success');
    if (success) success.call(options.context, resp);
  };

  options.complete = function() {
    _this.trigger('fetch:complete');
    if (complete) complete();
  };

  _this.trigger('fetch:start');

  return Backbone.Model.prototype.fetch.call(this, options);
}

链接到要点https://gist.github.com/fedyk/23761ce1236c5673fb84

于 2015-07-15T12:25:15.337 回答