计算属性,返回每个模型上的属性总和

时间:2015-12-23 19:11:47

标签: javascript ember.js ember-data computed-properties

我有一个购物车模型,然后其中的项目看起来像这样

[
    {
        "item_id": 1,
        "item_name":"Item 1",
        "item_price": 500
    },
    {
        "item_id": 2,
        "item_name": "Item 2",
        "item_price": 230
    },
    {
        "item_id": 3,
        "item_name": "Item 3",
        "item_price": 150
    }
]

我需要总结item_price属性才能显示它,然后将其传递给ember数据或ajax调用以完成购买。

不确定我是不是只是用计算机来理解agregate数据的东西,但我正在尝试用这个

totalDue: Ember.computed.sum('model.@each.item_price')

在控制器上,但它返回0

我正在使用余烬2.2.0

3 个答案:

答案 0 :(得分:3)

你可以这样做:

totalDue: Ember.computed('model.@each.item_price', function() {
  const model = this.get('model');
  if (!model) {
    return 0;
  }

  let sum = 0;
  model.forEach(item => sum += Ember.get(item, 'item_price'));
  return sum;
})

Working demo.

答案 1 :(得分:2)

你也可以做一个非常干净的单行:

totalDue: Ember.computed('model.@each.item_price', function() {
  return this.get('model').mapBy('item_price').reduce((a, b) => a + b, 0);
})

Working Demo

答案 2 :(得分:1)

你也可以这样做:

export default Ember.Controller.extend({
      model: [
        {
          "item_id": 1,
          "item_name":"Item 1",
          "item_price": 500
        },
        {
          "item_id": 2,
          "item_name": "Item 2",
          "item_price": 230
        },
        {
          "item_id": 3,
          "item_name": "Item 3",
          "item_price": 150
        }
      ],

      array: Ember.computed.mapBy('model', 'item_price'),
      sum: Ember.computed.sum('array'),
    });