如何知道Backbone model.fetch()何时完成?

时间:2013-02-17 05:31:00

标签: javascript backbone.js backbone-events backbone-model

我绑定了我的主干模型的更改事件。

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

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

this.model.fetch();

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

如果获取完成,我怎样才能始终触发this.render回调,无论是否触发更改事件?

先谢谢你的帮助

4 个答案:

答案 0 :(得分:12)

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

this.model.on('sync', this.render, this);
this.model.on('error', this.handleError, this);

答案 1 :(得分:1)

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

答案 2 :(得分: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
});

并在视图中,例如在initialize

View = Backbone.View.extend({
    initialize: function(){
        this.options.promise.done(function () {
            // your code here
        });
    }
});

答案 3 :(得分: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