Ember:改变可空关系的属性

时间:2016-11-21 07:51:17

标签: javascript ember.js ember-data relationship belongs-to

我有一个模型公司和一个模型地址。 company.address属于地址。因此,当我获取公司记录model(params) {return this.store.findRecord('company', params.companyID);}时,我可以使用model.address.street访问地址属性。但是当我的后端重新执行地址:null因为公司dosnt与地址有关系,我希望用户可以通过输入字段设置街道,我得到错误Assertion Failed: Cannot delegate set('street', a) to the 'content' property of object proxy <(subclass of Ember.ObjectProxy):ember1458>: its 'content' is undefined."

以下是具有null关系的json:

{"data": {
    "attributes": {"name": "test-company"}, "id": "5", 
    "relationships": {
        "address": {
            "data": null
            }
        }, 
        "type": "companies"
    }
}

那我怎么能避免这个错误呢?如果有公司记录,我可以在获取公司记录后证明model.address,但是在每条路线上这样做都不是很聪明。

1 个答案:

答案 0 :(得分:0)

首先,您的路由模型挂钩应确保组织具有有效的余烬数据记录的地址。如果没有,那么创建一个空的。

model: function(params) {
        const store = this.get('store');

        return Ember.RSVP.hash({
            org: store.findRecord('orgnanization', params.id).then(org => { 
                 org.get('address').then(address => {
                      if(Ember.isNone(address)) {
                         org.set('address', store.createRecrord('organization.address', {});
                      }
                 })
            }),
        });
 },

现在您的输入可以直接绑定到organization.address.street,因为它现在始终与ember-data记录相关。

 {{input type="text" value=model.org.address.street}}

编辑时你首先需要保存地址记录,所以它会有一个id,然后保存原始组织。

 editOrganization: function() {
    const org = this.get('model.org')
    const saveAddressPromise = org.get('address').then(address => {
        return Ember.isPresent(address.get('street')) ? address.save() : EMPTY_PROMISE(null);
    }); // If street is present save the address, other wise send empty promise that resolves to null

   return saveAddressPromise.then(address => {
       if(Ember.isNone(address) {
         org.set('address', null); // The street is not present still. dont save address record
       }

       return org.save();
   }).catch(sendError).finally(doSomething);
}

另一种方法是每次都保存一个空记录,然后你就不会有这个.street检查。

铌! Empty_promise代码示例

return new Ember.RSVP.Promise(function(resolve, reject) {
        resolve(value);
});