最好的办法在CompositeView中的排序集合(The best way to sort a c

2019-07-30 15:10发布

我想排序在集合Marionette.CompositeView
我有一个集合,看起来像这样:

[
   {id: 1, name: 'bar'},
   {id: 2, name: 'boo' },
   {id: 3, name: 'foo' }
]

我需要通过ID集合以相反的顺序进行排序。
其实,当我重新加载页面才起作用。
当我添加一个新的模式,新的项目被添加显然随机到列表中。
如果我刷新页面,就会得到很好的排序。

我的问题是:
1)当我添加一个新的模型如何解决这一问题?
2)将有可能改善的代码?


这里是我的代码:

return Marionette.CompositeView.extend({

    initialize: function () {
        this.collection.fetch();
    },

    onRender: function () {
        var collection =  this.collection;

        collection.comparator = function (collection) {
            return - collection.get('id');
        }
    },

    onSuccess: function () {
        this.collection.add(this.messageModel);
        this.collection.sort(); // the messageModel seems to be added 
                                // apparently randomly to the list. 
                                // only if I refresh the page it will be ok
    }
})

Answer 1:

对于牵线木偶> = 2.0, CollectionViewCompositeView 保持默认排序 。

对于木偶<2.0和> = 1.3.0:

var MySortedView = Backbone.Marionette.CollectionView.extend({

  // ...

  appendHtml: function(collectionView, itemView, index) {
    // Already sorted when buffering.
    if (collectionView.isBuffering) {
      Backbone.Marionette.CollectionView.prototype.appendHtml.apply(this, arguments);
    }
    else {
      var childrenContainer = $(collectionView.childrenContainer || collectionView.el);
      var children = childrenContainer.children();
      if (children.size() === index) {
        childrenContainer.append(itemView.el);
      } else {
        childrenContainer.children().eq(index).before(itemView.el);
      } 
    }
  }

});

对于牵线木偶<2.0或<1.3.0(同前不缓冲):

var MySortedView = Backbone.Marionette.CollectionView.extend({

  // ...

  appendHtml: function(collectionView, itemView, index) {
    var childrenContainer = $(collectionView.childrenContainer || collectionView.el);
    var children = childrenContainer.children();
    if (children.size() === index) {
      childrenContainer.append(itemView.el);
    } else {
      childrenContainer.children().eq(index).before(itemView.el);
    } 
  }

});

这是对的CollectionView和CompositeView中的相同。



Answer 2:

我相信木偶人正在考虑建设成木偶这一点,但直到那个时候,我已经建立一个叫小混入排序 ,你可以混合到您CollectionViewCompositeView类。 它在生产环境中被大量使用的Gitter很长一段时间,我们发现它工作得很好..



Answer 3:

当您创建集合,你可以声明.comparator? 从你的代码.comparator只存在于局部变量var collection的OnRender函数内。 如果正确定义的收集必须自动排序,你不需要增加新的模型之后调用的.sort

var Chapters = new Backbone.Collection({
    comparator = function(chapter) {
        return chapter.get("id");
    };
});


文章来源: The best way to sort a collection in a CompositeView