2011-03-10 37 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

相關問題