通过控制器上的操作设置belongsTo属性不起作用

时间:2014-04-01 23:53:55

标签: ember.js ember-data

我有以下型号,客户:

App.Customer = DS.Model.extend({
    //Other Attributes
    area: DS.belongsTo('area', {async: true})
});

和区域模型 -

App.Area = DS.Model.extend({
    name: DS.attr('string'),
    zip_code: DS.attr('number')
});

我使用Ember.Select视图显示客户所在区域的下拉列表 -

{{view Ember.Select viewName="select_area" content=possible_areas optionValuePath="content.id" optionLabelPath="content.name" value=area.id prompt="No area selected" selectionBinding="selected_area"}}

和将所有东西连接在一起的控制器 -

App.CustomerController = Ember.ObjectController.extend({
    possible_areas: function() {
        return this.store.find('area');
    }.property(),

    selected_area: null,
    actions: {
        save: function() {
            var selected_area_id = this.get('selected_area.id');
            console.log(selected_area_id);
            var selected_area = this.store.find('area', selected_area_id);
            var self = this;
            selected_area.then(function(area) {
                console.log(area.get('id'));
                var updated_customer = self.get('model');
                updated_customer.set('area', area );
                console.log(new_customer.get('area.id'));
                updated_customer.save()
                    .then(function(customer) {
                        //success
                    },
                    function() {
                        //failure
                    });
            });
        }
    }
});

现在这是奇怪的事情。在致电“保存”后第一次操作时,行updated_customer.set('area', area );失败并显示错误

Uncaught Error: Assertion Failed: Cannot delegate set('id', ) to the 'content' property of object proxy <DS.PromiseObject:ember551>: its 'content' is undefined.

致电&#39;保存&#39;在此之后立即执行操作,保存通过而没有任何错误,并且客户的区域已成功更新。虽然下拉列表显示selected_area为空。

如何防止第一次保存错误输出?

我使用的是ember-data 1.0.0-beta.6。

1 个答案:

答案 0 :(得分:2)

由于您在Customer模型中定义了关联,因此我会从控制器中删除selected_area属性,而是使用ember-data的关联。使用Ember.Select属性绑定到selectionBinding中的“区域”关联。

{{view Ember.Select viewName="select_area"
                    content=possible_areas
                    optionValuePath="content.id"
                    optionLabelPath="content.name"
                    prompt="No area selected"
                    selectionBinding="area"}}

这样,当用户与选择菜单进行交互时,area属性将会改变。

由于我们直接绑定save的{​​{1}}关联,因此可以清理area行动。

Customer

但是,当App.CustomerController = Ember.ObjectController.extend({ possible_areas: function() { return this.store.find('area'); }, actions: { save: function() { this.get('model').save().then(this.onDidCreate.bind(this), this.onDidFail.bind(this)) } onDidCreate: function() { // Fullfilled callback } onDidFail: function() { // Rejected callback } } }); 返回承诺时,模板首次呈现时不会填充possible_areas属性。我会等待呈现选择,直到承诺结算。您可以在路由this.get('area')挂钩中执行此操作,因为它等待承诺结算以呈现模板。

model