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

Posted

技术标签:

【中文标题】返回每个模型的属性总和的计算属性【英文标题】: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 做了一些不同的事情:它只是将数组值属性中的值相加。 【参考方案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'),
    );

【讨论】:

以上是关于返回每个模型的属性总和的计算属性的主要内容,如果未能解决你的问题,请参考以下文章

@each不更新计算的总和值

Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回

使用 CoreData 关系计算摘要

带有has_many的模型中的属性总和:通过关联在Rails 5中不起作用

Swift 计算属性返回底层数组的副本

使用核心数据计算多节表的总和