javascript - 属性 :desc is not the same as reverse 上的 Ember sortBy

标签 javascript ember.js

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

sortBy('something:asc') 工作正常。但是 sortBy('something:desc')sortBy('something:asc').reverse() 不同。 (不是desc吗?)

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

最佳答案

实际上,Ember.Enumerable.sortBy方法不采取任何方向,如所见 here ,就是这样Ember.computed.sort有效,如在文档示例中以及在对 here 进行内部调用时所见.

这意味着在您的代码中 "asc" 也不起作用。你只是偶然得到正确的结果。 Relevant github issue

此外,只有字符串作为 sortBy 的参数的原因是因为 sortBy internally calls Ember.get在每个元素上按您提供的名称提取属性,属性名称是字符串。

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

sortBy 确定元素顺序的方法是调用 compare来自 ember-runtime 的方法,不幸的是,这是一个内部操作,没有 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)。

关于javascript - 属性 :desc is not the same as reverse 上的 Ember sortBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40168813/

相关文章:

javascript - Google Maps API - 默认光标类型

javascript - 如何在Jquery中多次调用一个函数来添加事件监听器而不是只监听最后一个?

javascript - Ember 模板链接

javascript - Ember 附加 RESTadaptor : error on <Ember. Route:ember325>/加载路由时出错,然后大量转储 JavaScript

javascript - 需要帮助理解 onclick 以及如何从声明的变量中连续减去

javascript - promise 包装模式

javascript - 使用 javascript 访问内联 SVG 元素

ember.js - Ember 数据 : how to set isDirty for a record?

javascript - 从 ember.js 中的 Controller 检索计算属性

javascript - Ember.TextField 绑定(bind)在 Ember RC1 中发生了变化?