骨干是否对集合中的所有元素进行排序或仅添加了元素

时间:2013-06-13 22:45:56

标签: javascript performance sorting backbone.js collections

在无休止的滚动活动期间,我的Backbone应用程序出现了速度问题;模型会单独添加到集合中,因此每次都会对集合进行排序。我想知道如何优化这个并有两个​​解决方案:

  1. 缓存它们并将它们批量添加到集合中,将20种类型合并为1个
  2. 默默地将模型添加到集合中,并debouncing我在每次添加时进行的排序调用(因此最后只进行了一次调用)
  3. 所以我想知道2是否可能,因为它更容易实现,如果有更好的解决方案,我没有想到。谢谢!

3 个答案:

答案 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%的时间加载我的无限卷轴。

谢谢!