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;
我发现a
和b
是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
。
为了清楚起见,我已将 object
重命名为 realty
。
【问题讨论】:
【参考方案1】:它们可能是PromiseObject
s,它们都是Ember.Object
和Promise
。您做的一些事情可能不是一个好主意:
第一个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 - 按关联的模型属性排序的主要内容,如果未能解决你的问题,请参考以下文章