我正在使用Ember JS和Ember Data开发一个网站。 我正在显示OrderItems列表,每个OrderItem与Product有一个belongsTo关系。在OrderItem的对象控制器中,我需要计算行总数(数量*产品价格)。 我的问题是我无法掌握产品数据。
模型
//OrderItem
export default DS.Model.extend({
order: DS.belongsTo('order'),
product: DS.belongsTo('product'),
quantity: DS.attr('number'),
lineTotal: DS.attr('number')
});
//Product
export default DS.Model.extend({
productNo: DS.attr('string'),
name: DS.attr('string'),
shortDescription: DS.attr('string'),
longDescription: DS.attr('string'),
price: DS.attr('number'),
stock: DS.attr('number'),
});
控制器
//store/checkout-lines
export default Ember.ArrayController.extend({
itemController: 'store/checkout-line'
});
//store/checkout-line
export default Ember.ObjectController.extend({
orderlinetotal: function(){
var item = this.get('model');
var quantity = item.get('quantity');
var product = item.get('product');
var lineTotal = quantity * product.get('price');
return lineTotal;
}.property('quantity'),
actions: {
deleteItem: function(){
var item = this.get('model');
this.store.deleteRecord(item);
item.save();
}
}
});
这一行:
var product = item.get('product');
返回一个余烬对象
但是这个:
product.get('price');
返回undefined ...
我该如何解决这个问题?我试过使用.then(),就像这样:
product.then(function(){this.get('price');});
然后我得到错误get(...)。那么它不是一个函数,因为product不是promise而是Ember数据对象。
修改
这是订单型号
export default DS.Model.extend({
customer: DS.belongsTo('customer'),
description: DS.attr('string'),
name: DS.attr('string'),
status: DS.attr('number'),
totalPrice: DS.attr('number'),
orderItems: DS.hasMany('order-item', {async: true})
});
这是json响应(按照与执行顺序相同的顺序)
//GET /orders/58
{"order":
{"id":58,
"description":null,
"name":null,
"status":2,
"totalPrice":5000.0000,
"orderItems":[36]}
}
//GET /orderItems?orderId=58
{"orderItem":[
{"id":36,
"product":2,
"quantity":1,
"order":58,
"lineTotal":5000.0000}
]}
//GET /product/2
{"product":
{"id":2,
"productNo":"0001-01",
"name": "Extreme Volume Mascara",
"shortDescription":"Sort",
"longDescription":"The best volumizing mascara there is",
"price":50.0000,
"stock":1000}
}
编辑2
我找到了解决问题的方法。不确定这是否是正确的方法,但我在the ember discuss forum
的评论中得到了这个想法我认为产品数据已正确加载,因为我在store / checkout-lines模板中显示属性(因为我可以看到HTTP请求)。但由于某种原因,在商店/ chekout-line控制器中我无法获得产品的数据,除了产品ID。也许上下文没有正确加载?我确实认为它与ObjectController(store / checkout-line)有关,因为如果我循环遍历ArrayController(store / checkout-lines)中的所有orderItems,我可以访问产品数据。
无论如何,这是我的解决方案:
//store/checkout-line
export default Ember.ObjectController.extend({
isNew: function(){
return this.get('model').get('order').get('status') === 1;
}.property('order.status'),
orderlineTotal: function(k,v){
if(arguments.length > 1){
return v;
}
var self = this;
var model = this.get('model');
var productId = model.get('product').get('id'); //only property I have access to
var promise = this.store.find('product', productId); //this will not call the web api, because the product is already in memory
promise.then(function(product){
var result = product.get('price') * model.get('quantity');
self.set('orderlineTotal', result);
})
}.property('product.price', 'quantity'),
actions: {
deleteItem: function(){
var item = this.get('model');
this.store.deleteRecord(item);
item.save();
}
}
});