在无休止的滚动事件中,我的 Backbone 应用程序出现了速度问题;模型被单独添加到集合中,因此每次都会对集合进行排序。我想知道如何优化它并有两种解决方案:
- 缓存它们并批量添加到集合中,将 20 种合并为 1
- 静默地将模型添加到集合中,并在每次添加期间消除我对排序的调用(所以最后只进行了一次调用)
所以我想知道 2 是否可能,因为它更容易实现,如果有更好的解决方案我没有想到。谢谢!
在无休止的滚动事件中,我的 Backbone 应用程序出现了速度问题;模型被单独添加到集合中,因此每次都会对集合进行排序。我想知道如何优化它并有两种解决方案:
所以我想知道 2 是否可能,因为它更容易实现,如果有更好的解决方案我没有想到。谢谢!
您可以使用Collection.reset()将多个元素插入到您的集合中,并且只触发一个排序事件。添加的元素将被替换,因此如果现有元素存在,则需要合并它们。
您可以使用debounce方法覆盖 add 方法并自己调用 sort ,而不是缓存项目。
initialize: function() {
// if you declare the debounce at the Collection.extend(...) level, it will be
// global to all objects (if you have 20 collections they all have to stop calling
// sort before this will fire) so putting it here in initialize is probably wise
this.sort = _.debounce(function(a, b) {
/* do your mojo */
}, 250)
},
add: function(m, opts) {
if( !m instanceof Backbone.Model ) {
m = new Backbone.Model(m);
}
this.models.push(m);
// probably need to check for opts here and honor silent?
this.trigger('add', m);
// for consistency, not sure if this should come before or after the trigger for "add"
this.sort();
}
因为我使用的是 Parse,所以我不得不修改他们旧版本的 Backbone 以options.sort
在函数中包含该选项Collection.add
:
if (this.comparator && options.sort !== false) {
this.sort({silent: true});
}
所以我添加 usingcollection.add(model, {sort:false})
然后调用collection.sort()
.
但是,就我而言,我也意识到没有必要进行排序(因为模型是按排序顺序添加的),所以我完全取消了排序,并在批量加载期间为自己节省了大约 10% 的时间无尽的滚动。
谢谢!
可以肯定的是,您的收藏是否因为您定义了比较器功能而自动排序?
我尝试阅读 Backbone 和 Underscore 源以确定使用的排序方法。不幸的是,我在阅读 10 分钟后无法理解,所以我无法确定是否使用了低性能的排序方法。不过,我怀疑排序是你的主要放缓。根据我的经验,收集速度问题通常来自从添加和更新事件重新渲染的视图。
通过将您的想法与 1 结合起来,2 是非常可能的,只需将新模型添加到数组中并使用_.debounce
每 500 毫秒将数组添加到集合中。确保您传递给 debounce 的函数也清除了数组。