【问题标题】:Ember Model Object hasMany does not return array as I would expectEmber 模型对象 hasMany 没有像我期望的那样返回数组
【发布时间】:2013-12-29 03:47:44
【问题描述】:

我正在尝试使用 Ember Data 的 hasMany 字段向我返回一个数组并将数组中项目的计数作为计算属性。但是,当我执行以下操作时,它会返回一个对象(由于 {async: true}? 而这似乎是一个承诺?)而不是我期望的数组。

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 对象,而不是 then 中完成的 promise 的值。我将如何获得评估承诺返回的值?

number_of_people: (function(){
  return this.get('people').then(function(people){
    return people.get('length');
  });
})

【问题讨论】:

    标签: javascript arrays ember.js ember-data


    【解决方案1】:

    这是一个 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}}
    

    【讨论】:

    • 这行得通,但我想从承诺中返回人的长度作为我的计算属性 number_of_people。我该怎么做?请参阅上面对我的问题的编辑。
    • 我在上面加了一个例子
    • 谢谢。这很简单,但我试图让它复杂化。
    • 谢谢。使用DS.FixtureAdapter 对我的业力测试有同样的问题/困境:要么让hasMany 不异步并且在前端失败,要么使用{'async':true} 并在The content property of DS.PromiseArray should be set before modifying it 的测试中失败。您使用then(...) 的解决方案解决了这个问题。 点赞
    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2013-09-26
    • 2019-12-04
    相关资源
    最近更新 更多