如何将Ember-Data关联与ArrayProxy结合使用

时间:2012-03-19 21:04:22

标签: ember.js

我正在尝试将我的应用迁移到使用Ember-Data作为其持久性机制。令我印象深刻的是,我不确定是否仍然可以将arrayProxy用于hasMany关联的聚合属性。在我之前的迭代中,我没有任何明确的关联,只是通过特定属性绑定在一起的控制器。现在我想利用ember-data中的关联功能,但是当我试图将我的数组代理的内容绑定到DS.Model的“children”属性时,我遇到了错误。我的代码在下面,这里有一个jsfiddle:http://jsfiddle.net/sohara/7p6gb/22/

我得到的错误是:

Uncaught TypeError: Object App.recipeController.content.ingredients has no method 'addArrayObserver'

我希望能够保留控制器层,即使在模型级别控制数据关联也是如此。它(理想情况下)就像嵌入在父对象的json表示中的子对象一样,以避免多个服务器请求。

window.App = Ember.Application.create();

App.store = DS.Store.create({
    revision: 3,
    adapter: DS.fixtureAdapter
});

App.Ingredient = DS.Model.extend({
    name: DS.attr('string'),
    price: DS.attr('string')
});

App.Recipe = DS.Model.extend({
    name: DS.attr('string'),
    ingredients: DS.hasMany('App.Ingredient', {embedded: true} )
});

 App.Recipe.FIXTURES = [
    {id: 1, name: 'Pizza', ingredients: [{id: 1, name: 'tomato sauce', price: 2, recipeId: 1}]}
 ];

App.recipeController = Ember.Object.create({
    content: App.store.find(App.Recipe, 1)
});

App.ingredientsController = Ember.ArrayProxy.create({
    content: 'App.recipeController.content.ingredients',

    totalWeigth: function() {
        var price = 0;
        items = this.get('content');
        items.forEach(function(item) {
            weight += price;
        });
    }.property()

});

1 个答案:

答案 0 :(得分:4)

App.ingredientsController中,您需要contentBinding: 'App.recipeController.content.ingredients',而不是content: ...