Ember.js计算嵌套关系的属性

时间:2014-08-23 12:43:18

标签: javascript ember.js ember-data

我正在开发一个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:

  • 任务时间1:用户= 1 /持续时间= 5
  • 任务时间2:用户= 1 /持续时间= 2
  • 任务时间3:用户= 2 /持续时间= 4

应该有以下结果:

[
    {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"),

由于所涉及的承诺,当然不起作用。我真的不是一个有承诺等的专家,所以也许有一些方法可以做到这一点,我到目前为止一直缺席。

1 个答案:

答案 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数组。