2011-09-30 60 views
4

我有一個骨幹模型,我已經改變了set方法來計算每組模型的額外屬性。Backbone.js Collection.create和覆蓋Model.set

根據文檔,這應該是調用超級以確保模型實際保存的方式。

Backbone.Model.prototype.set.call(this, attributes, options); 

它正常工作,除非我使用Collection.create。

我的自定義設置方法得到運行,但我認爲原始沒有,因爲集合仍然是空的。 服務器接收到正確的數據併發回正確的數據。在兩種情況下,我的方法都會執行,但集合仍然是空的。

我可以更改超級調用以使其與Collection.create一起使用,還是有另一種方法可以做同樣的事情嗎?

+0

一路上拋出一個異常,也許?你有沒有檢查你的控制檯,以確保不是這種情況? –

+0

沒有例外,所以永遠。這會讓事情變得更容易,但可悲的是,它只是默默地失敗了。 –

回答

14

就像我想的那樣,我錯過了一些東西。 重寫Model.set()時,必須在末尾放置return this;

因此,一個模型應該是這樣的:

var MyModel = Backbone.Model.extend({ 
    set: function(attributes, options) { 
     // Custom code... 
     return Backbone.Model.prototype.set.call(this, attributes, options); 
    } 
}); 
+4

或者,實際上,您只需返回「超級」的結果,因爲您真的只是覆蓋它:'return Backbone.Model.prototype.set。 call(this,attributes,options);' –

+4

如果你返回這個,而不是調用Backbone.Model set方法,驗證將不起作用,因爲它應該用於該模型。它永遠不會返回錯誤,在驗證過程中出現錯誤時會發生什麼情況。 – 2011-11-24 18:18:21

1

我建議破解打開一個調試器,並通過它。看看Collection.create函數和Model.save函數。請注意,create函數調用Model.save,回調函數爲successModel.save將數據發送到服務器,並鏈接到調用Model.setsuccess回調。

我會在這兩個函數的success回調中放置斷點,因爲它們非常直截了當,很可能會指出您的問題。

最後,如果您能夠用jsFiddle重現問題,那麼它對幫助我們理解問題的完整背景將非常有用。

+1

非常感謝。我遵照你的建議找到了它。必須磨練我的JS調試技能,他們顯然需要它:) –