在无休止的滚动活动期间,我的Backbone应用程序出现了速度问题;模型会单独添加到集合中,因此每次都会对集合进行排序。我想知道如何优化这个并有两个解决方案:
所以我想知道2是否可能,因为它更容易实现,如果有更好的解决方案,我没有想到。谢谢!
答案 0 :(得分:1)
您可以使用Collection.reset()向您的集合中插入多个元素,并仅触发一个排序事件。添加的元素将被替换,因此如果存在,则需要合并现有元素。
您可以使用debounce方法覆盖add方法并自行调用排序,而不是缓存项目。
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();
}
答案 1 :(得分:0)
可以肯定的是,您的收藏是否自动排序,因为您定义了comparator function?
我尝试通过Backbone和Underscore来源阅读以确定使用的排序方法。不幸的是,我在读取10分钟后无法完成它,所以我无法弄清楚是否使用了低性能的排序方法。尽管如此,我仍然怀疑排序是你的主要减速。根据我的经验,收集速度问题通常来自于从添加和更新事件重新呈现的视图。
通过将您的想法与1组合,只需将新模型添加到数组并使用_.debounce
每隔500毫秒将数组添加到集合中,就可以实现2。确保您传递去抖动的功能也清除了阵列。
答案 2 :(得分:0)
因为我正在使用Parse,所以我必须修改旧版本的Backbone以在options.sort
函数中包含Collection.add
选项:
if (this.comparator && options.sort !== false) {
this.sort({silent: true});
}
所以我使用collection.add(model, {sort:false})
添加,然后调用collection.sort()
。
然而,在我的情况下,我也意识到排序是没有必要的(因为模型是按排序顺序添加的),所以我完全减少了排序并节省了自己〜批量的10%的时间加载我的无限卷轴。
谢谢!