Ember 数据异步关系的聚合
Aggregation for Ember Data Async Relationships
我有一个由多个交易组成的发票,任何交易都有一个总金额作为最终结果,它来自两个值的乘积:数量和票价
我正在尝试计算任何交易的所有这些总和
这是错误 Uncaught TypeError: Cannot read property 'getEach' of undefined
我明白为什么会这样,总值还不存在(因为还没有计算)
这是我的模型,函数为 transactionsAmounts
App.Invoice = DS.Model.extend({
title : DS.attr('string'),
transactions : DS.hasMany('transaction', { async:true}),
transactionsAmounts: function() {
var sum = function(s1, s2) { return s1 + s2; };
return this.get('model').getEach('total').reduce(sum);
}.property('model.@each.total'),
});
App.Transaction = DS.Model.extend({
quantity: DS.attr('string'),
fare: DS.attr('string'),
total: DS.attr('string'),
invoice: DS.belongsTo('invoice'),
updateTotal: function() {
// get the reference to the values of fare and quantity
var quantity = this.get('quantity'),
fare = this.get('fare');
// massage them to make sure your stuff is not gonna break
if (isNaN(fare)) { fare = 0; }
if (isNaN(quantity)) { quantity = 0; }
// calculate
var total = fare * quantity;
// set the total
this.set('total', total);
}.observes('quantity', 'fare')
});
这是我用来计算所有总数的另一个函数,但我得到了同样的错误
transactionsAmounts: function(){
var totals = this.get("total");
return totals.reduce(function(previousValue, total){
return previousValue + totals.get("transactionsAmounts");
}, 0);
}.property("totals.@each.total")
这个案例我已经复现了jsbin
我该怎么做?
这是一个工作的 js bin,您的代码位已修改:http://jsbin.com/lipakamasi/18/edit?js,console,output
你的问题出在你的模型声明中,你在其中混合了一些东西:
App.Invoice = DS.Model.extend({
title : DS.attr('string'),
transactions : DS.hasMany('transaction', { async:true}),
transactionsAmounts: 0,
setTransactionAmount : function(){
if(this.get("transactions.length")>0){
this.get("transactions").then(function(transactions){
var sum=0;
transactions.forEach(function(transaction){
sum+=transaction.get("total");
});
this.set("transactionsAmounts",sum);
}.bind(this));
}
}.observes('transactions.length', 'transactions.@each.total'), /
});
首先看看 property
或 observes
你试图参考 model.@each
这对 ArrayController
很好但是你在 [=15] =] :) 您想要 observes
的是交易。
然而那些 transactions
是异步的,因此 ember 将加载一个 "promise" 从而与 "async" javascript.
一起工作
我有一个由多个交易组成的发票,任何交易都有一个总金额作为最终结果,它来自两个值的乘积:数量和票价
我正在尝试计算任何交易的所有这些总和
这是错误 Uncaught TypeError: Cannot read property 'getEach' of undefined
我明白为什么会这样,总值还不存在(因为还没有计算)
这是我的模型,函数为 transactionsAmounts
App.Invoice = DS.Model.extend({
title : DS.attr('string'),
transactions : DS.hasMany('transaction', { async:true}),
transactionsAmounts: function() {
var sum = function(s1, s2) { return s1 + s2; };
return this.get('model').getEach('total').reduce(sum);
}.property('model.@each.total'),
});
App.Transaction = DS.Model.extend({
quantity: DS.attr('string'),
fare: DS.attr('string'),
total: DS.attr('string'),
invoice: DS.belongsTo('invoice'),
updateTotal: function() {
// get the reference to the values of fare and quantity
var quantity = this.get('quantity'),
fare = this.get('fare');
// massage them to make sure your stuff is not gonna break
if (isNaN(fare)) { fare = 0; }
if (isNaN(quantity)) { quantity = 0; }
// calculate
var total = fare * quantity;
// set the total
this.set('total', total);
}.observes('quantity', 'fare')
});
这是我用来计算所有总数的另一个函数,但我得到了同样的错误
transactionsAmounts: function(){
var totals = this.get("total");
return totals.reduce(function(previousValue, total){
return previousValue + totals.get("transactionsAmounts");
}, 0);
}.property("totals.@each.total")
这个案例我已经复现了jsbin
我该怎么做?
这是一个工作的 js bin,您的代码位已修改:http://jsbin.com/lipakamasi/18/edit?js,console,output
你的问题出在你的模型声明中,你在其中混合了一些东西:
App.Invoice = DS.Model.extend({
title : DS.attr('string'),
transactions : DS.hasMany('transaction', { async:true}),
transactionsAmounts: 0,
setTransactionAmount : function(){
if(this.get("transactions.length")>0){
this.get("transactions").then(function(transactions){
var sum=0;
transactions.forEach(function(transaction){
sum+=transaction.get("total");
});
this.set("transactionsAmounts",sum);
}.bind(this));
}
}.observes('transactions.length', 'transactions.@each.total'), /
});
首先看看 property
或 observes
你试图参考 model.@each
这对 ArrayController
很好但是你在 [=15] =] :) 您想要 observes
的是交易。
然而那些 transactions
是异步的,因此 ember 将加载一个 "promise" 从而与 "async" javascript.