我有一个名为survey
,question
和response
的余烬模型。 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。
答案 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回调将针对已解析数组中的每个项目调用一次。