2016-11-21 10 views
1

У меня есть модель компании и адрес модели. company.address относится к адресу. Поэтому, когда я беру отчет компании model(params) {return this.store.findRecord('company', params.companyID);}, я могу получить доступ к атрибутам адреса с помощью model.address.street. Но когда мой backend обращается к адресу: 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."Ember: изменить атрибут нулевой связи

Вот json с нулевым отношением :

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

Так как я могу избежать этой ошибки? Я мог бы подтвердить модель. Address после получения записи компании, если у нее есть идентификатор, но делать это в каждом маршруте не очень умно.

ответ

0

Ну, сначала ваш крюк маршрутной модели должен убедиться, что у организации есть адрес с действительной записью данных ember-данных. Если нет, то создайте пустую.

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, потому что теперь связана с записью уголек-данных в любое время.

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

И при редактировании Сначала вам нужно сохранить запись адреса, чтобы она имела идентификатор, а затем сохранила исходную организацию.

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.

Nb! Пример кода Empty_promise

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

благодарит за ваш ответ. Я думаю, что это будет отлично работать, чтобы создать новую запись каждый раз, когда компания.address пуста. Но есть ли способ сделать это в каждой модели автоматически? Я пробовал его в стандартном редакторе serializeResponse() без успеха. У тебя есть идея? –

 Смежные вопросы

  • Нет связанных вопросов^_^