返回每个模型的属性总和的计算属性
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'),
);
【讨论】:
以上是关于返回每个模型的属性总和的计算属性的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回