Ember Model Object hasMany不会像我期望的那样返回数组

时间:2013-12-29 03:47:44

标签: javascript arrays ember.js ember-data

我正在尝试使用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');
  });
})

1 个答案:

答案 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}}