在Ember 2中,我在Enumerable上尝试sortBy
。
sortBy('something:asc')
的工作正确无误。但sortBy('something:desc')
与sortBy('something:asc').reverse()
不同。 (不是desc
?)
我尝试将something
属性更改为布尔值或字符串或数字。它似乎只是"字符串"类型适用于reverse
。
答案 0 :(得分:5)
实际上,Ember.Enumerable.sortBy方法没有采取任何方向,如here所示,这就是Ember.computed.sort的工作方式,如文档示例所示,以及跟踪内部调用时here
这意味着您的代码中"asc"
也无效。你只是偶然得到了正确的结果。 Relevant github issue
此外,只有字符串作为sortBy
参数的原因是因为sortBy
internally calls Ember.get在每个元素上按您提供的名称提取属性,以及属性名字是字符串。
换句话说,sortBy
的签名是sortBy(property)
(docs)
sortBy
确定元素顺序的方法是从ember-runtime调用compare方法,遗憾的是,这是一个内部操作,没有API可以影响它。
以下是如何正确地对两个方向进行排序:
sortBy('something')
sortBy('something').reverse()
(不幸的是)我认为这是故意的,因为Ember遵循convention over configuration范式,基本上迫使你赞成使用Ember.computed.sort
,特别是如果表现很重要的话。
sortingBy: ['something:desc'],
sortedCollection: Ember.computed.sort('collection', 'sortingBy')
您可以做的另一个解决方法是使用toArray方法将Enumerable转换为常规JS数组,对其进行排序,然后使用新排序的数组覆盖该属性:
const sortedDesc = this.get('something')
.toArray() // convert the enumerable to a regular JS array
.sort(/* your descending sort comparison function */);
this.set('something', sortedDesc);
这会更快(不需要反转数组),但会占用更多内存,因为每次排序时它都会创建一个新数组(通过调用toArray
)。