【问题标题】:Computed property that returns a sum of a property on each model返回每个模型的属性总和的计算属性
【发布时间】:2016-03-30 06:36:06
【问题描述】:

我有一个购物车模型,然后里面有看起来像这样的物品

[
    {
        "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 调用以完成购买。

不确定我是否只是不理解带有计算的聚合数据,但我正在尝试这个

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

在控制器上,但它返回 0

我在 ember 上 2.2.0

【问题讨论】:

  • Ember.computed.sum 做了一些不同的事情:它只是将数组值属性中的值相加。

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


【解决方案1】:

你可以这样做:

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.

【讨论】:

  • 得到model.forEach is not a function,模型也被定义在模型钩子的路由上,只是还没有使用ember数据或ajax调用。我也在 ember 2.2.0
  • 你能告诉我控制器中的console.log(this.get('model')) 值吗?那么model 是否在控制器上定义?如果没有,那么您必须在使用它之前在路由中的setupController 钩子中设置model 属性。
  • 抱歉您的代码有效,因为我发布了这个我设置了返回多个模型的路线,所以将this.get('model') 更改为this.get('model.items') 有效
【解决方案2】:

您也可以将其作为非常干净的单线:

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

Working Demo

【讨论】:

  • 在该控制台的控制台中出现this.get(...).mapBy is not a function 错误。
  • 如果你把这个 - console.log(this.get('model')) - 放在 return 语句之上,它会为你输出什么?
  • 抱歉,忘记将模型切换到 RSVP 哈希,所以我需要使用 mode.items 来获取模型哈希的项目部分。
  • 啊,这样就行了。 :-)
【解决方案3】:

你也可以这样做:

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'),
    });

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 2021-07-06
    • 2018-10-13
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多