EmberJS computed.sort - 按关联的模型属性排序

时间:2016-10-05 11:02:02

标签: sorting ember.js computed-properties

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

contract.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')

    ...
});

不起作用。

使用自定义比较器功能a

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

1 个答案:

答案 0 :(得分:4)

它们可能是PromiseObject个,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时,街道尚未加载。添加正确的依赖关键字可能会解决这个问题。