我有一個Backbone Collection
,我希望它以某種方式響應自己的更新(即添加,刪除,重置)。我已經在各種情況下運行到這一點,但就事論事,讓我們說,我計算哈希基於模型的IDS,快速比較集合:在添加/刪除/重置時更新Backbone Collection屬性
var HashedCollection = Backbone.Collection.extend({
updateHash: function() {
// set a simple hash based on model id
this.hash = this.pluck('id').sort().join('|');
}
});
的問題是,什麼是正確的如何保持我的散列最新?
可能的選項:
自設偵聽事件:
this.on('add remove reset', this.updateHash, this);
這樣做的問題是,一些動作可能是無聲的,但我還是要更新哈希 - 這對於首次設置來說尤其是問題,在
initialize
中不會發生這種情況,因爲該集合還沒有其模型,並且初始重置事件是無聲的(relevant code)。此外,這意味着任何其他組件都可以通過傳遞{ silent: true }
來混淆收集狀態。設置功能將覆蓋
.add
,.remove
,.reset
,和/或.set
:set: function() { Backbone.Collection.prototype.set.apply(this, arguments); this.updateHash(); } // etc
這裏最大的問題是處理單
add
/set
電話與在reset
多次調用 -reset
電話add
多次,它多次調用set
,所以包裝set
意味着我們將在重置中爲每個項目更新一次哈希。如果updateHash
比上面的簡單例子更昂貴,這可能是一個真正的問題。另一個較小的問題是,我最終得到了很多重寫的函數,導致更多的半樣板代碼和更多的潛在的核心方法中的錯誤。
爲了討論的緣故,請假設:a)計算散列很昂貴,b)散列經常被引用。
有沒有更好的方法來保持收集狀態與它的模型保持一致?
那你最終會做什麼? – fbynite
在我自己的代碼中,我目前仍在使用一個自定義偵聽器,併爲最初的「重置」事件進行修復。但我應該把下面的答案之一標記爲正確的,因爲我認爲它們都比我現在的方法更好... – nrabinowitz