我正在开发一个Ember.js应用程序(Ember 1.7,Ember Data Beta 9,REST Adapter)。
我有以下型号:
App.Task = DS.Model.extend({
tasktimes: DS.hasMany('tasktime', {async: true}),
// ...
});
App.Tasktime = DS.Model.extend({
task: DS.belongsTo('task', {async: true}),
user: DS.belongsTo('user', {async: true}),
duration: DS.attr()
//...
});
我想要实现的是获得每个用户的所有任务时间数组以及总持续时间。
例如:
任务1:
应该有以下结果:
[
{user: user1, totalDuration: 7},
{user: user2, totalDuration: 4}
]
我不知道如何实现这样的嵌套计算属性。我试过各种各样的方法,但到目前为止还没有。 (在我早期的方法中,用户总是没有解决,因此整个事情都不起作用。)
问题是我需要两个级别的"然后"在两个foreach循环中,我不知道如何使用promises。
这是基本的想法:
durationPerUser: function() {
var data = Ember.A();
var tt = this.get("tasktimes");
tt.forEach(function(item) {
item.get("user").get(function(user) {
// If no entry exists yet, create a new one
if(data[item.get("user.id")] == undefined) {
data[item.get("user.id")] = {totalDuration: 0, user: item.get("user")};
}
// Add the hours to the array
data[item.get("user.id")].totalDuration += item.get("duration");
});
});
return data;
}.observes("tasktimes.@each.user", "tasktimes.@each.starttime", "tasktimes.@each.endtime", "tasktimes.@each"),
由于所涉及的承诺,当然不起作用。我真的不是一个有承诺等的专家,所以也许有一些方法可以做到这一点,我到目前为止一直缺席。
答案 0 :(得分:0)
不会有这样的工作吗?
App.Task = DS.Model.extend({
tasktimes: DS.hasMany('tasktime', {async: true}),
// ...
durationPerUser: function(){
var users = this.get('users');
var tasktimes = this.get('tasktimes');
var result = [];
users.forEach(function(user){
var thisUsersTasktimes = tasktimes.filterBy({'user', user })
var totalDuration = 0;
thisUsersTasktimes.forEach(function(tasktime){
totalDuration += tasktime.get('duration');
});
result.push({user: user, totalDuration: totalDuration});
});
return result;
}.property('users.@each', 'tasktimes.@each')
})
第二个想法需要用户和任务之间的关联,我刚刚意识到你现在没有,但是你可以轻松地通过关联创建很多关联并为你的任务提供用户id数组。