我有一个 Ember.ArrayController
,其中包含未排序的内容。
我想知道是否可以在不使用新属性的情况下对 ArrayController 的内容进行排序。
我当然可以创建一个新属性:
App.MyArrayController = Em.ArrayController.extend({
mySortMethod: function(obj1, obj2) {
// some code here
},
updateSortedContent: function() {
var content = this.get('content');
if (content) {
var sortedContent = content.copy();
sortedContent.sort(this.mySortMethod);
this.set('sortedContent', sortedContent);
}
}.observes('content')
});
但我希望有更好的方法,不重复内容。
最佳答案
更新
最新版本的 Ember 实际上内置了排序功能。ArrayController
现在包含 Ember.SortableMixin
,如果您指定 sortProperties
( Array)和可选的 sortAscending
( bool 值)。
注意:使用新的 SortableMixin,您仍然需要引用 arrangedContent
来获取排序版本。模型本身将保持不变。 (感谢乔纳森·特兰)
App.userController = Ember.ArrayController.create({
content: [],
sortProperties: ['age'],
sortAscending: false
})
原始答案
正确的方法是使用 ArrayProxy 的 arrangedContent
属性。此属性旨在被重写以提供内容数组的排序或过滤版本。
App.userController = Ember.ArrayController.create({
content: [],
sort: "desc",
arrangedContent: Ember.computed("content", function() {
var content, sortedContent;
content = this.get("content");
if (content) {
if (this.get("sort") === "desc") {
this.set("sort", "asc");
sortedContent = content.sort(function(a, b) {
return a.get("age") - b.get("age");
});
} else {
this.set("sort", "desc");
sortedContent = content.sort(function(a, b) {
return b.get("age") - a.get("age");
});
}
return sortedContent;
} else {
return null;
}
}).cacheable()
});
关于arrays - 对ArrayController的内容进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10498969/