我可以成功地做到这一点:
App.SomeCollection = Backbone.Collection.extend({
comparator: function( collection ){
return( collection.get( 'lastName' ) );
}
});
如果我想要一个仅按“姓氏”排序的集合,这很好。但我需要动态完成这种排序。有时,我需要按“firstName”进行排序。
我的彻底失败包括:
我尝试传递一个额外的变量来指定要排序的变量。那没有用。我也尝试了 sortBy()
,但也不起作用。我尝试将自己的函数传递给 sort(),但这也不起作用。将用户定义的函数传递给 sortBy()
只是为了让结果没有 each
方法,从而破坏了新排序的 Backbone 集合的意义。
有人可以提供一个按未硬编码到比较器函数中的变量进行排序的实际示例吗?或者你有什么有效的技巧吗?如果没有,是否有有效的 sortBy()
调用?
最佳答案
有趣的问题。我会在这里尝试策略模式的变体。您可以创建排序函数的哈希,然后根据所选的哈希成员设置比较器
:
App.SomeCollection = Backbone.Collection.extend({
comparator: strategies[selectedStrategy],
strategies: {
firstName: function () { /* first name sorting implementation here */ },
lastName: function () { /* last name sorting implementation here */ },
},
selectedStrategy: "firstName"
});
然后,您可以通过更新 selectedStrategy
属性的值来动态更改排序策略。
编辑:我上床 sleep 后意识到:)这不太像我上面写的那样工作,因为我们将一个对象文字传递给Collection.extend
。 comparator
属性将在创建对象时计算一次,因此除非强制,否则它不会动态更改。可能有一种更简洁的方法可以做到这一点,但这演示了动态切换比较器功能:
var SomeCollection = Backbone.Collection.extend({
comparator: function (property) {
return selectedStrategy.apply(myModel.get(property));
},
strategies: {
firstName: function (person) { return person.get("firstName"); },
lastName: function (person) { return person.get("lastName"); },
},
changeSort: function (sortProperty) {
this.comparator = this.strategies[sortProperty];
},
initialize: function () {
this.changeSort("lastName");
console.log(this.comparator);
this.changeSort("firstName");
console.log(this.comparator);
}
});
var myCollection = new SomeCollection;
这是一个jsFiddle这证明了这一点。
我认为,所有问题的根源在于 JavaScript 对象文字上的属性在创建对象时立即计算,因此如果您想更改它,则必须覆盖该属性。如果您尝试将某种切换写入属性本身,它将被设置为初始值并保持在那里。
这是一个很好的blog post在稍微不同的背景下讨论这个问题。
关于backbone.js - 动态对backbone.js集合进行排序的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9865804/