我有一个 Backbone Collection
,我希望它以某种方式响应自己的更新(即添加、删除、重置)。我在各种场景中都遇到过这种情况,但为了讨论,假设我正在计算基于模型 id 的哈希,以快速比较集合:
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
因为集合还没有它的模型,所以这不会发生,并且初始重置事件是静默的(相关代码)。另外,这意味着任何其他组件都可以通过传递{ 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) 散列被频繁引用。
这里有没有更好的方法来保持集合状态与其模型保持同步?