【问题标题】:Ember.js computed property of nested relationshipEmber.js 嵌套关系的计算属性
【发布时间】:2014-08-23 12:43:18
【问题描述】:

我正在开发一个 Ember.js 应用程序(Ember 1.7、Ember Data Beta 9、REST 适配器)。

我有以下型号:

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 循环中使用两个级别的“then”,我不知道如何让它与 Promise 一起使用。

这是基本的想法:

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

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

【问题讨论】:

  • 我知道这已经有一段时间了,但你有没有想过这个?我有一个几乎相同的场景,涉及 contentItem 及其相关标签,我想对给定 contentItem 的所有标签进行操作。

标签: javascript ember.js ember-data


【解决方案1】:

这样的东西不可行吗?

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

【讨论】:

  • 好吧,我真的无法建立这样的关系。当然,我可以为“一个用户的所有任务时间”提供服务,但我想要的是“一个项目的用户的所有任务时间”。此外,您的代码没有考虑异步行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2013-11-29
相关资源
最近更新 更多