【问题标题】:EmberJS computed.sort - sorting by associated model propertyEmberJS computed.sort - 按关联的模型属性排序
【发布时间】:2017-02-13 19:05:55
【问题描述】:

我有一个简单的belongsTo 模型关系:

合同.js:

export default DS.Model.extend({
    object               : DS.belongsTo('object'),
    ....
})

object.js:

export default DS.Model.extend({
    street              : DS.attr('string'),
    zip                 : DS.attr('string'),
    city                : DS.attr('string'),
    ...
})

在我的控制器中,对于拥有许多 contracts 的实体,我想按关联的 object 的街道名称进行排序,但不知何故

export default Ember.Controller.extend({

    sortOrder: ['object.street'],
    sortedObjects: Ember.computed.sort('model.contracts', 'sortOrder')

    ...
});

没用。

使用自定义比较器函数

function(a, b){
    if (a.street > b.street) {
      return 1;
    } else if (a.street < b.street) {
      return -1;
    }
}

我发现abPromises,但不知何故我不知道如何通过嵌套属性(对象的街道)对它们进行排序

编辑

再澄清一下代码:

contracts : Ember.computed.alias('model.contracts'),
street: Ember.computed.alias('realty.street'),

sortOrder: ['realty.street'],
sortedOwnedRealties: Ember.computed.sort('contracts.@each.street', function (a, b) {
    console.log(Ember.get(a, 'id'));
    console.log(Ember.get(a, 'street'));

    //return 1;
})

该函数将undefined 打印到street 的控制台,但正确的是id

为了清楚起见,我已将 object 重命名为 realty

【问题讨论】:

    标签: sorting ember.js computed-properties


    【解决方案1】:

    它们可能是PromiseObjects,它们都是Ember.ObjectPromise。您做的一些事情可能不是一个好主意:

    第一个object 是保留关键字。拥有一个名为 object 的模型或关系不是一个好主意,即使它可能有效。

    其次,您的计算属性具有错误的依赖项键。实际上,您可能想要'modelcontracts.@each.object.street' 而不是'modelcontracts',但是这将起作用,因为不支持'@each.a.b'。解决方案是在合约上为街道创建别名:

    street: Ember.computed.alias('object.street'),
    

    然后你可以使用它作为你的依赖键:modelcontracts.@each.street

    接下来在您的自定义比较器函数中,您通过点符号访问a.street。这对 ember 对象不起作用并且不可靠。始终使用.get() 访问属性:

    import Ember form 'ember';
    const {get} = Ember;
    
    
    function(a, b){
      if(get(a, 'street') > get(b, 'street')) {...}
    }
    

    但也请注意,如果没有上面提到的computed.alias,则不是get(a, 'street'),而是get(a, 'object.street')


    您的代码无法正常工作的问题可能是 object 是异步加载的,因此在评估您的 CP 时,街道尚未加载。添加正确的依赖键可能会解决这个问题。

    【讨论】:

    • 抱歉,object 属性是我过于急切地简化代码的结果。当然,它不叫object。我在model.contracts 中有另一个错字。我觉得我越来越近了,但还不是很接近 - 请参阅上面的编辑。
    • 您应该将street: Ember.computed.alias('realty.street') 添加到您的contract.js 旁边的realty:DS.belongsTo('realty'),而不是您的排序CP。
    • 谢谢!使用更简单的版本,我什至将其缩小到:sortOrder: ['street'], sortedOwnedRealties: Ember.computed.sort('contracts', 'sortOrder')
    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多