Ember-数据模型计算值,返回值而不是promise

时间:2013-09-16 19:14:15

标签: ember.js ember-data promise

我有一个名为surveyquestionresponse的余烬模型。 survey有多个question个,其中有多个response个。每个response都有一个属性count

如何在total_response_count模型中设置survey计算值?在emberjs 1.0.0中,questions位于DS.PromiseArray中(由于async:true),因此当我返回计算值时,它在我的模板中显示为Object而不是值。 / p>

我可以从responses模型轻松访问question,因为responses已嵌入question。但是,Ember会自动为questions引用的survey做出承诺,因为{async:true}。

调查模型:

App.Survey = DS.Model.extend({
  title: DS.attr('string'),
  owner_id: DS.belongsTo('user'),
  questions: DS.hasMany('question', {async:true}),

  total_responses: function() {
    var question_cb = function(prevValue, item) {
      return prevValue + item.get('total_responses');
    };

    return this.get('questions').then(function(questions){
      return questions.reduce(question_cb, 0);
    });
  }.property('questions')
});

问题模型:

App.Question = DS.Model.extend({
  survey: DS.belongsTo('survey'),

  question: DS.attr('string'),

  responses: DS.hasMany('response'),

  total_responses: function() {
    var response_cb = function(prevValue, item) {
      return prevValue + item.get('count');
    };

    return this.get('responses').reduce(response_cb, 0);
  }.property('responses')
});

响应模型:

App.Response = DS.Model.extend({
  response: DS.attr('string'),
  count: DS.attr('number'),

  question: DS.belongsTo('question')
});

我正在使用ember-1.0.0和ember-data 1.0 beta-2。

1 个答案:

答案 0 :(得分:6)

我也在Github上问了这个问题,得到了Yehuda Katz的回复:

您可以尝试这样的事情:

App.Survey = DS.Model.extend({
  title: DS.attr(),
  owner: DS.belongsTo('user'),
  questions: DS.hasMany({ async:true }),

  totalResponses: Ember.arrayComputed('questions', {
    initialValue: 0,
    addedItem: function(accum, item) {
      accum += item.get('totalResponses');
    },
    removedItem: function(accum, item) {
      accum -= item.get('totalResponses');
    }
  })
});

当问题解决后,totalResponses中的addedItem回调将针对已解析数组中的每个项目调用一次。