Ember sortBy在property:desc上与reverse不同

Hao*_*Hao 2 javascript ember.js

在Ember 2中,我尝试sortBy了Enumerable。

sortBy('something:asc')工程纠正。但是sortBy('something:desc')不一样sortBy('something:asc').reverse()。(不是desc吗?)

我试图将something属性更改为布尔值或字符串或数字。似乎只有“ string”类型适用于reverse

nem*_*035 5

实际上,Ember.Enumerable.sortBy方法不带任何方向,因为看到这里,这是怎么Ember.computed.sort,工作以及后续内部通话时如文档例子看到这里

这意味着您的代码"asc"也不起作用。您只是偶然获得正确的结果。相关的github问题

此外,之所以只能将字符串用作参数,sortBy是因为sortBy 内部 在每个元素上调用Ember.get来按您提供的名称提取属性,而属性名称是字符串。

换句话说,的签名sortBysortBy(property)docs

的方式sortBy确定的元素的顺序是通过调用比较从余烬的运行时方法,其不幸的是,内部操作,而且也没有API来影响它。

正确执行双向排序的方法如下:

  • 上升: sortBy('something')
  • 降序:(sortBy('something').reverse()不幸的是)

我相信这是有意的,因为Ember遵循约定优于配置范式,基本上迫使您赞成使用Ember.computed.sort,尤其是在性能很重要的情况下。

sortingBy: ['something:desc'],
sortedCollection: Ember.computed.sort('collection', 'sortingBy')
Run Code Online (Sandbox Code Playgroud)

您可以执行的另一种解决方法是使用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);
Run Code Online (Sandbox Code Playgroud)

这样会更快(不需要反转数组),但是会占用更多内存,因为toArray每次您排序时都会创建一个新数组(通过调用)。