在我的backbone.js应用中,有一个Trips collection
持有Trip models
,它与LocalStorage
一起使用。我可以致电Trips.create(form_attributes)
创建并保存到Todos store
的旅程。
首次加载应用时,我致电Trips.fetch({ success: trips_fetch_success })
,trips_fetch_success
收到一条回复,其中显示Trip models
所持有的Trips collection
。
我尝试将refresh
和change
事件绑定到Trips collection
,但这些事件没有被捕获,让我相信我对哪些事件{{1}有错误的想法触发器。
我的问题:应该Trips.fetch
触发哪些事件?是在集合上还是在每个Trips.fetch
上触发事件?
答案 0 :(得分:59)
Collection.fetch()
会在成功时调用reset
,这反过来会触发'重置'事件。集合重置事件的任何订阅者都应该收到该事件。
这里的关键是“成功”。我遇到了这个问题,却发现骨干网正在默默地吞下我的错误信息。传递一个错误处理程序,至少记录到console.log()
,看看发生了什么:
trips.fetch({error: function() { console.log(arguments); }});
(注意:旧版本的backbone.js会触发“刷新”而不是“重置”)
答案 1 :(得分:52)
如果您使用的是主干1.0,则需要在fetch()调用中传递reset:true以便与重置事件绑定:
trips.fetch({reset: true});
答案 2 :(得分:20)
从骨干1.0开始,model.fetch()触发'同步'。这就是你应该绑定的东西。
以下是来自backbone.js源的相关部分,其中触发了'sync'事件:
fetch: function(options) {
options = options ? _.clone(options) : {};
if (options.parse === void 0) options.parse = true;
var model = this;
var success = options.success;
options.success = function(resp) {
if (!model.set(model.parse(resp, options), options)) return false;
if (success) success(model, resp, options);
// HERE'S THE TRIGGER!
model.trigger('sync', model, resp, options);
};
wrapError(this, options);
return this.sync('read', this, options);
},