2

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

合同.js:

export default DS.Model.extend({
    object               : DS.belongsTo('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;
    }
}

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

编辑

为了进一步澄清代码:

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

为了清楚起见,我已重命名objectrealty

4

1 回答 1

4

它们可能是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')but get(a, 'object.street')


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

于 2016-10-05T12:50:15.490 回答