我正在尝试使用Ember Data的hasMany字段来返回一个数组,并将数组中的项计数作为计算属性。但是,当我执行以下操作时,它会返回一个对象(由于{async:true}而显示为promise)?而不是我期望的数组。
App.Shift = DS.Model.extend({
name: DS.attr('string'),
people: DS.hasMany('person', {async: true});
number_of_people: (function(){
this.get('people').length
}).property('people')
)};
App.Person = DS.Model.extend({
first_name: DS.attr('string'),
last_name: DS.attr('string')
});
更新:我想回复一下这个人的长度。我试过这个但是当我访问该属性时,我得到了仍然返回的promise对象,而不是当时返回的完成promise的值。如何获得承诺返回的评估值?
number_of_people: (function(){
return this.get('people').then(function(people){
return people.get('length');
});
})
答案 0 :(得分:4)
这是一个promise数组,这意味着当你第一次尝试访问它时,它将开始获取数据,一旦完成,你可以从该promise数组中访问它。此外,它是一个承诺,因此您可以使用then(...)
以异步方式访问值。
shift.get('people').then(function(people){
console.log(people.get('length'));
});
重要的是要记住它是异步的,因此根据您使用该值的位置,它会在某个时刻从0变为0+。以下更正的计算属性将随时更新长度更新
number_of_people: function(){
return this.get('people.length');
}.property('people.length')
模板中的
{{number_of_people}}
话虽这么说,这个计算属性是没有意义的,你可以在模板中使用它,就像这样,它也会更新
{{people.length}}