EmberJS:如何在计算属性中使用嵌套对象属性?

时间:2014-06-27 08:00:58

标签: for-loop ember.js

我无法理解在嵌套对象模型中调用子项属性的正确方法,并使用它们来计算新属性。这是我到目前为止所做的:

Monitor.ProcessController = Ember.ObjectController.extend({
  nbUsers: function() {
    var total = 0;
    this.get('containers').then(function(containers) {
            containers.forEach(function(container, index){
               total += container.get('nbUsers');
            });
        });
    return total;
  }.property('containers.@each.nbUsers')
});

Monitor.ContainerController = Ember.ObjectController.extend();

Monitor.Process = DS.Model.extend({
  containers: DS.hasMany('container', {async : true}),
  name: DS.attr('string')
});

Monitor.Container = DS.Model.extend({
  process: DS.belongsTo('process'),
  name: DS.attr('string'),
  nbUsers: DS.attr('integer')
});

// Test data

Monitor.Process.FIXTURES = [
 {
  id: 1,
  name: 'Mumble',
  containers: [1,2]
 },
 {
  id: 2,
  name: 'EVE',
  containers: [3]
 }
];

Monitor.Container.FIXTURES = [
 {
  id: 1,
  name: 'First',
  process: 1,
  nbUsers: 1
 },
 {
  id: 2,
  name: 'Second',
  process: 1,
  nbUsers: 1
 },
 {
  id: 3,
  name: 'Unique',
  process: 2,
  nbUsers: 1
 }
];

因此,Process有多个子容器,我想基于容器数据动态地计算每个进程的总用户数。听起来微不足道,显然不是。

{{nbUsers}}一直返回“0”。 关于我做错了什么的指示?

1 个答案:

答案 0 :(得分:0)

您的属性是异步的,因此您在更新总数之前返回0,并且由于它不是传回的引用,因此它不会更新值#&# 39;已经被退回了。因此,属性总数会更新,但不会更新返回到计算属性的值。

更改它的最简单方法是使其成为观察者,并让它更新属性。

Monitor.ProcessController = Ember.ObjectController.extend({
  nbUsers: 0,
  nbUsersWatcher: function() {
    var self = this;
    this.get('containers').then(function(containers) {
      var total = 0;
      containers.forEach(function(container, index){
        total += container.get('nbUsers');
      });
      self.set('nbUsers', total);
    });
  }.observes('containers.@each.nbUsers')
});

您也可以使用计算机,但在我告诉您可能之前,我必须先测试一下。