模型被销毁时未发出同步事件 - Backbonejs

时间:2013-02-18 18:01:07

标签: javascript backbone.js

模型集合未发出' sync'模型被销毁时的事件。文件seems to say the opposite。这是我的代码片段:

var MyModel = Backbone.Model.extend({ id: 1, val: "foo" });
var MyCollection = Backbone.Collection.extend({ model: MyModel, url: '/api/models' });

var myCollection = new MyCollection();

myCollection.on('sync', function () { console.log('synced!'); });
myCollection.on('remove', function () { console.log('removed!'); });

myCollection.fetch(); // => outputs synced!

    // .. wait for collection to load

myCollection.at(0).destroy(); // => outputs removed! but *NOT* synced!        

如果我理解得很好,那么医生会说“摧毁”。事件应该冒泡到集合并发出同步信息。事件。如果上面代码中的集合发出了“同步”信息。事件与否?

2 个答案:

答案 0 :(得分:7)

从集合中删除后,在销毁的对象上触发'sync'事件。这就是该集合不会触发“同步”事件的原因。该集合虽然传递了“破坏”事件。

答案 1 :(得分:4)

编辑:'同步'在模型从集合中删除后触发,即使使用了wait:true选项。

以下是Backbone的代码,它触发集合上的模型事件。

// Internal method called every time a model in the set fires an event.
// Sets need to update their indexes when models change ids. All other
// events simply proxy through. "add" and "remove" events that originate
// in other collections are ignored.
_onModelEvent: function(event, model, collection, options) {
  if ((event === 'add' || event === 'remove') && collection !== this) return;
  if (event === 'destroy') this.remove(model, options);
  if (model && event === 'change:' + model.idAttribute) {
    delete this._byId[model.previous(model.idAttribute)];
    if (model.id != null) this._byId[model.id] = model;
  }
  this.trigger.apply(this, arguments);
},

您的问题很可能是因为'同步'由于同步期间出错,因此未在模型上触发事件(然后在集合上触发)。

从Backbone来源,您可以看到' sync'在请求成功时触发,所以也许你可以调试它,看看sync中的成功回调是否被命中?

var success = options.success;
    options.success = function(resp) {
      if (success) success(model, resp, options);
      model.trigger('sync', model, resp, options);  // breakpoint here.
    };

你能在那里放一个断点,看看是否触发了事件?我认为它不会达到这条线。

还尝试使用错误回调:

myCollection.at(0).destroy({
    error: function(model, xhr, options){
        console.log(model);  // this will probably get hit
    }
});