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

Posted

技术标签:

【中文标题】EmberJS computed.sort - 按关联的模型属性排序【英文标题】:EmberJS computed.sort - sorting by associated model property 【发布时间】: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

【问题讨论】:

【参考方案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')

以上是关于EmberJS computed.sort - 按关联的模型属性排序的主要内容,如果未能解决你的问题,请参考以下文章

EmberJS嵌套动态路由不会按预期重定向

从EmberJs组件进行ajax调用的正确方法?

Ember 计算排序不在服务中排序

emberjs 和 Foundation4

emberjs 基金会 5 手风琴

EmberJS、助手和 ComputedProperty