模型集合未发出' 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!
如果我理解得很好,那么医生会说“摧毁”。事件应该冒泡到集合并发出同步信息。事件。如果上面代码中的集合发出了“同步”信息。事件与否?
答案 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
}
});