每个google结果都与ArrayController排序有关。需要一个不使用ArrayController的排序机制。
有一个模型,其中有排序参数。就像说'sortOrder'作为模型中的一个属性(它将来自后端)。
将使用#each呈现此模型,但这应该基于sortOrder属性而不是模型的ID属性进行迭代。
答案 0 :(得分:30)
在Ember 2.0 SortableMixin
已被弃用,并且即将推出。
在Controller
(不是ArrayController
)中,您可以在下面定义一个新的计算属性,如SortedUsers1,2,3
:
export default Ember.Controller.extend({
sortProps: ['lastName'],
sortedUsers1: Ember.computed.sort('model', 'sortProps'),
sortedUsers2: Ember.computed.sort('content', 'sortProps'),
sortedUsers3: Ember.computed('content', function(){
return this.get('content').sortBy('lastName');
})
});
上面的假设是模型本身是一个用户数组,lastName
作为用户属性之一。对'model'
和'content'
的依赖看起来与我相同。上面的所有三个计算属性都生成相同的排序列表。
请注意,您无法将'sortProps'
参数替换为'lastName'
中的sortedUsers1,2
- 它将无效。
要更改排序顺序,请将sortProps
修改为
sortProps: ['lastName:desc']
此外,如果您的模板位于users / index文件夹中,那么您的控制器也必须在那里。即使路由加载模型在用户/.
中,用户/中的控制器也不会这样做在模板中,使用情况符合预期:
<ul>
{{#each sortedUsers1 as |user|}}
<li>{{user.lastName}}</li>
{{/each}}
</ul>
答案 1 :(得分:5)
以下是我手动排序(使用余烬比较)的方法
import Ember from "ember";
import { attr, Model } from "ember-cli-simple-store/model";
var compare = Ember.compare, get = Ember.get;
var Foo = Model.extend({
orderedThings: function() {
var things = this.get("things");
return things.toArray().sort(function(a, b) {
return compare(get(a, "something"), get(b, "something"));
});
}.property("things.@each.something")
});
答案 2 :(得分:3)
您只需要在控制器或组件中加入SortableMixin,然后指定sortAscending
和sortProperties
属性。
Em.Controller.extend(Em.SortableMixin, {
sortAscending: true,
sortProperties: ['val']
});
答案 3 :(得分:0)
在这种情况下,我直接使用Ember.ArrayProxy
和Ember.SortableMixin
。
ArrayProxy包装实现Ember.Array的任何其他对象 和/或Ember.MutableArray,转发所有请求。这非常有用 对于许多绑定用例或其他情况有用 能够换出底层数组很有用。
例如,我可能有一个控制器属性:
sortedItems: function(){
var items = Ember.ArrayProxy.extend(Ember.SortableMixin).create({content: this.get('someCollection')});
items.set('sortProperties', ['propNameToSortOn']);
return items;
}.property()
像这样:JSBin