您可以通过为您的集合提供comparator 方法来实现您想要的。
示例:
ModelCollection = Backbone.Collection.extend({
comparator: function(a, b) {
if ( a.get("name") > b.get("name") ) return 1;
if ( a.get("name") < b.get("name") ) return -1;
if ( a.get("name") === b.get("name") ) return 0;
},
initialize: function() {
this.on('change:name', function() { this.sort() }, this);
}
});
此示例中的comparator 将使您的集合按内部模型的name 属性升序排序。
请注意,您的集合在更改其任何models 的属性时不会自动排序。默认情况下,排序仅在创建新模型并将它们添加到集合时发生;但是comparator 将被collection.sort 方法使用。
上面的代码通过设置一个事件侦听器来利用这一点,该侦听器只是将任何changes 上的集合重新排序为其models 的name 属性。
为了完成图片,我们在与集合关联的View 中设置了一个适当的事件侦听器,以确保它在任何更改时重新呈现:
CollectionView = Backbone.View.extend({
initialize: function() {
this.collection = new ModelCollection();
this.collection.on('all', function() { this.render() }, this);
},
render: function() {
this.$el.html(this.collection.toJSON());
}
});
就是这样:)
来自Backbone documentation的相关摘录:
默认情况下,集合没有comparator。如果您定义了comparator,它将用于按排序顺序维护集合。这意味着随着模型的添加,它们将插入到collection.models 中的正确索引处。比较器可以定义为sortBy(传递一个接受单个参数的函数)、sort(传递一个需要两个参数的比较器函数),或者作为一个字符串来指示要排序的属性。 [...] 如果您以后更改模型属性,带有comparator 的集合将不会自动重新排序,因此您可能希望在更改会影响顺序的模型属性后调用sort。