2011-03-10 61 views
68

在我的backbone.js应用程序中,有一个Trips collection,它包含Trip models,它与LocalStorage一起工作。我可以拨打Trips.create(form_attributes)来创建并保存Todos store的行程。在Backbone.js集合上调用fetch()时会触发什么事件?

当初加载我的应用程序,我请Trips.fetch({ success: trips_fetch_success }),并trips_fetch_success接收表示Trip modelsTrips collection持有的响应。

我试图绑定refreshchange事件到Trips collection,但这些事件没有被抓住,让我相信我有这个错误的观念有关的事件Trips.fetch触发器。

我的问题:应该触发哪些事件Trips.fetch?并且是在集合上还是在每个个人Trip models上触发的事件?

回答

59

Collection.fetch()会调用reset成功,这反过来会触发'重置'事件。收藏重置事件的任何订阅者都应该收到该事件。

这里的关键是“成功”。我有这个问题,只能发现骨干无声地吞咽了我的错误信息。在错误处理程序传递,至少,日志console.log(),看看发生了什么:

trips.fetch({error: function() { console.log(arguments); }}); 

(注:Backbone.js的旧版本将触发“刷新”,而不是“复位”)

+4

您可以有一个全局jQuery ajax错误处理程序来处理这类错误,通常与连接问题有关。 – Julien 2011-03-11 15:19:03

+9

从主干0.5+开始,'Collection#refresh' [重命名](http://documentcloud.github.com/backbone/#changelog)到'Collection#reset'。该事件也相应地更名。 – ejel 2011-07-23 20:40:38

+1

此外,有用的知道'重置'回调有两个默认参数''重置“(集合,选项)',它会在集合的全部内容被替换时触发。' – 2013-04-03 15:31:54

52

如果您使用的骨干1.0,则需要通过复位:真正的取()调用,以便与复位事件绑定:

trips.fetch({reset: true}); 
+6

好点。当我希望基于模型提取()来刷新视图时,我将绑定到“同步”。这就是1.0中默认触发的内容。 – 2013-06-11 21:14:41

19

为骨干1.0,model.fetch()触发'同步'。这就是你应该绑定的东西。

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); 
}, 
+2

这是来自backbone.js源代码的实际代码,顺便说一句。我只是重新阅读我的评论,并想知道代码是我自己的...最好是明确的。 – 2013-12-06 01:51:32

相关问题