Ember.computed.sort属性未更新

时间:2016-09-26 09:52:53

标签: ember.js

过去几天我一直在低头,试图了解我做错了什么。 我正在为我的应用实现列表基础结构,其中包括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.[]')

1 个答案:

答案 0 :(得分:1)

您的sort函数正在观察整个数组sortingDefinitions而不是数组中的每个元素。如果数组更改为字符串或其他变量,则会更新,但如果数组中的元素发生更改则不会更新。

为确保正确更新计算属性,请在数组末尾添加.[],使其如下所示:Ember.computed.sort('content', 'sortingDefinitions.[]')