EmberJS computed.sort - 按关联模型排序 属性
EmberJS computed.sort - sorting by associated model property
我有一个简单的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 la
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
。
它们可能是PromiseObject
,它们都是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 时,街道尚未加载。添加正确的依赖键可能会解决这个问题。
我有一个简单的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 la
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
。
它们可能是PromiseObject
,它们都是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 时,街道尚未加载。添加正确的依赖键可能会解决这个问题。