如何使用Ember Data在控制器中获取belongsTo对象

时间:2014-08-06 11:33:55

标签: javascript ember.js ember-data

我正在使用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();
        }
    }
});

0 个答案:

没有答案