过去几天我一直在低头,试图了解我做错了什么。
我正在为我的应用实现列表基础结构,其中包括paging/infinite scroll/filtering/grouping/
等。该实现基于扩展控制器(不是数组控制器,我希望是Ember 2.0安全),具有保存数据的content
数组属性。
我正在使用Ember.computed.sort进行排序,它正在运行,但是当我尝试更改分拣机时,我有一种奇怪的行为。即使sortedContent
定义已更新,displayContent
也未在sortingDefinitions
内更新。
这会导致一种奇怪的行为,它只会在我sort
两次时进行排序,就好像排序是异步的一样。
我正在使用Ember 1.5
(但它也发生在1.8)
(附上一段解释我问题的代码)
sortingDefinitions: function(){
var sortBy = this.get('sortBy');
var sortOrder = this.get('sortOrder') || 'asc';
if (_.isArray(sortBy)) {
return sortBy;
}
else {
return (sortBy ? [sortBy + ':' + sortOrder] : []);
}
}.property('sortBy', 'sortOrder'),
sortedContent: Ember.computed.sort('content', 'sortingDefinitions'),
displayContent: function() {
var that = this;
var sortBy = this.get('sortBy');
var sortOrder = this.get('sortOrder');
var list = (sortBy ? this.get('sortedContent') : this.get('content'));
var itemsPerPage = this.get('itemsPerPage');
var currentPage = this.get('currentPage');
var listItemModel = this.get('listItemModel');
return list.filter(function(item, index, enumerable){
return ((index >= (currentPage * itemsPerPage)) && (index < ((currentPage + 1) * itemsPerPage)));
}).map(function(item) {
var listItemModel = that.get('listItemModel');
if (listItemModel) {
return listItemModel.create(item);
}
else {
return item;
}
});
}.property('content.length', 'sortBy', 'sortOrder', 'currentPage', 'itemsPerPage')
修改 通过向displayContent(sortedContent。[])添加另一个依赖项来修复:
displayContent: function() {
....
}.property('content.length', 'sortBy', 'sortOrder', 'currentPage', 'itemsPerPage' , 'sortedContent.[]')
答案 0 :(得分:1)
您的sort函数正在观察整个数组sortingDefinitions
而不是数组中的每个元素。如果数组更改为字符串或其他变量,则会更新,但如果数组中的元素发生更改则不会更新。
为确保正确更新计算属性,请在数组末尾添加.[]
,使其如下所示:Ember.computed.sort('content', 'sortingDefinitions.[]')