我有一个表格中呈现的骨干集合。我想根据集合具有的某些属性将表格排序,如“task_status”,“task_group”。我正在阅读有关collection.comparator,nd collection.sort的主干文档。 我该怎么做到这一点?基于模型属性的排序骨干集合
回答
comparator
函数用于比较集合中的两个模型,它可以以任何(一致)的方式比较它们。特别是,它可以选择模型属性使用,因此你可以有你的收藏中是这样的:
initialize: function() {
this.sort_key = 'id';
},
comparator: function(a, b) {
// Assuming that the sort_key values can be compared with '>' and '<',
// modifying this to account for extra processing on the sort_key model
// attributes is fairly straight forward.
a = a.get(this.sort_key);
b = b.get(this.sort_key);
return a > b ? 1
: a < b ? -1
: 0;
}
,然后你只需要在收集一些方法来改变sort_key
,并呼吁sort
:
sort_by_thing: function() {
this.sort_key = 'thing';
this.sort();
}
在较老的骨干网中,呼叫sort
将触发"reset"
事件,而较新的版本将触发"sort"
事件。为了弥补这两种情况下,你可以听的事件和重新渲染:
// in the view...
initialize: function() {
this.collection.on('reset sort', this.render, this);
}
演示:http://jsfiddle.net/ambiguous/7y9CC/
initialize: function() {
this.listenTo(this.collection, 'reset sort', this.render);
}
@ mu-is-too-short的答案是好的,除非有一种更简单的方法来比较字段值:
根据字段对集合进行排序的最简单方法是提供一个比较器函数,该函数返回要排序的确切字段值。这种比较器使Backbone调用sortBy
函数,而不是sort
,然后它自己进行复杂的比较,你不必担心逻辑。
因此,本质上,您不必提供复杂的比较函数,除非您有更高级的需求来确定顺序。
var myCollection = Backbone.Collection.extend({
sort_key: 'id', // default sort key
comparator: function(item) {
return item.get(this.sort_key);
},
sortByField: function(fieldName) {
this.sort_key = fieldName;
this.sort();
}
});
在这之后你可以调用集合的sortByField
- 函数与表示要排序的键的字符串。 例如:
collection.sortByField('name');
修改@我,是太短的演示:http://jsfiddle.net/NTez2/39/
请注意,此示例不再有效,因为Backbone不再在排序时触发重置事件。它触发排序事件。 – 2013-06-19 23:21:34
感谢您的领导!我更新了该示例以适应该更改:http://jsfiddle.net/NTez2/39/ – jylauril 2013-06-25 11:31:37
单参数比较器(和'_.sortBy')的大问题是无法在升序和降序之间切换以任何理智的方式处理字符串。数字降序很容易,因为您可以取消数字,但否定字符串并不容易。如果不将它们混合到一个单独的字符串中,您也无法按几个键进行排序,并且需要注意将其正确设置。 – 2013-08-15 16:15:07
@ jylauril的回答有极大的帮助,但是需要修改演示(在骨干网或许细微变化,因为它被张贴?)
看起来您需要在排序后触发渲染。
$('#by-s').click(function() {
c.sortByField('s');
v.render();
});
更新@我,是太短的演示:是的,'>`和`<`工作:http://jsfiddle.net/NTez2/13/
- 1. 以优雅的方式迭代基于模型属性的骨干集合
- 2. 骨干集合保持模型突变的排序顺序
- 3. 排序具有多个属性的骨干集合
- 4. 查找模型,可是没有骨干集合中的属性
- 5. 集合的骨干定制属性
- 6. 集模型 - 骨干
- 7. 排序集合中的骨干数值
- 8. 骨干集合获取属性
- 9. 骨干模型上的动态属性
- 10. 骨干集合总是与n模型
- 11. 将模型添加到骨干集合
- 12. 骨干模型收集
- 13. 类似于骨干模型/集合的反应库
- 14. 骨干排序集合通过点击非模板元素
- 15. 骨干:集合内部模型的顺序
- 16. 骨干更改模型并更改新模型的属性
- 17. 带骨干收集的可排序表
- 18. 按字母顺序排序使用密钥的骨干集合
- 19. 基于模型的属性
- 20. 骨干:从收集得到的模型
- 21. 骨干集/模型的最佳实践
- 22. 找属于其OneToOne模型的属性排序模型
- 23. 基于if属性设置的ember.js组件排序模型
- 24. 骨干顺序集合按字母顺序排列
- 25. 骨干筛选使用多个属性的集合
- 26. 筛选具有多个属性的骨干集合
- 27. 基于另一个模型属性排序 - Ruby
- 28. 从小胡子模板访问嵌套骨干模型属性
- 29. 访问模型从骨干视图下划线模板属性
- 30. 模型集合上的骨干事件(双击)
我可以在一个情况下的排序字段是字符串 – MrFoh 2012-07-16 19:28:36
@MrFoh使用这种模式在字符串中,演示中的's'属性是一个字符串。 – 2012-07-16 20:16:34
请注意,此示例不再有效,因为Backbone不再在排序时触发重置事件。它触发排序事件。 – 2013-06-19 23:15:58