3

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

  1. 缓存它们并批量添加到集合中,将 20 种合并为 1
  2. 静默地将模型添加到集合中,并在每次添加期间消除我对排序的调用(所以最后只进行了一次调用)

所以我想知道 2 是否可能,因为它更容易实现,如果有更好的解决方案我没有想到。谢谢!

4

3 回答 3

1

您可以使用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();
}
于 2013-06-13T23:36:58.453 回答
0

因为我使用的是 Parse,所以我不得不修改他们旧版本的 Backbone 以options.sort在函数中包含该选项Collection.add

      if (this.comparator && options.sort !== false) {
        this.sort({silent: true});
      }

所以我添加 usingcollection.add(model, {sort:false})然后调用collection.sort().

但是,就我而言,我也意识到没有必要进行排序(因为模型是按排序顺序添加的),所以我完全取消了排序,并在批量加载期间为自己节省了大约 10% 的时间无尽的滚动。

谢谢!

于 2013-06-14T21:05:43.650 回答
0

可以肯定的是,您的收藏是否因为您定义了比较器功能而自动排序?

我尝试阅读 Backbone 和 Underscore 源以确定使用的排序方法。不幸的是,我在阅读 10 分钟后无法理解,所以我无法确定是否使用了低性能的排序方法。不过,我怀疑排序是你的主要放缓。根据我的经验,收集速度问题通常来自从添加和更新事件重新渲染的视图。

通过将您的想法与 1 结合起来,2 是非常可能的,只需将新模型添加到数组中并使用_.debounce每 500 毫秒将数组添加到集合中。确保您传递给 debounce 的函数也清除了数组。

于 2013-06-13T23:33:48.383 回答