3

当模型被销毁时,模型集合不会发出“同步”事件。文档似乎相反。这是我的代码片段:

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!        

如果我理解得很好,文档说“销毁”事件应该冒泡到集合中并发出一个“同步”事件。上面代码中的集合是否应该发出“同步”事件?

4

2 回答 2

7

从集合中删除后,在销毁的对象上触发“同步”事件。这就是集合不触发“同步”事件的原因。不过,该系列传达了“毁灭”事件。

于 2013-02-18T20:12:59.433 回答
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命中了成功回调?

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
    }
});
于 2013-02-18T18:30:01.203 回答