2016-08-08 4 views
0

Рассмотрим следующие 2 модели: автомобиль и владелецEmber BelongsTo Assertion Failed

У меня есть запись автомобиля с текущим владельцем (боб Джоунс) и у меня есть владелец записи (Боб Джонс) с подробностями ... адрес , телефон и т.д.

в моей форме автомобиля (модель автомобиля), у меня есть это:

export default Model.extend({ 
    "owner_id": DS.belongsTo('owner'), 
    "year": attr(''), 
    "model": attr(''), 
    "make": attr('') 
}) 

хранящегося в конце DB, является идентификатором «12345», соответствующий владелец записи Боба Джонса.

Когда я загрузить автомобиль запись (2015 Jaguar), он также будет подключаться к записи Боба Джонса, который говорит мне свой телефон, адрес и т.д. Например, если я распечатать

{{owner_id.id}} - {{owner_id.name}} 

Я буду шоу:

12345 - Боб Джонс

Мой вопрос, что произойдет, если я изменю владелец автомобиля. Если я выбираю из выпадающего списка

{{my-select 
    name="owner_id" 
    content=ownerList 
    selection=owner_id.id 
    prompt="select an owner" 
    required=true 
}} 

От этого компонента:

import Ember from 'ember'; 

export default Ember.Component.extend({ 
    content: [], 
    prompt: null, 
    optionValuePath: 'value', 
    optionLabelPath: 'label', 

    init: function() { 
    this._super(...arguments); 
    if (!this.get('content')) { 
     this.set('content', []); 
    } 
    }, 

    actions: { 
    change: function() { 
     let selectedIndex = this.$('select')[0].selectedIndex; 
     let content = this.get('content'); 

     // decrement index by 1 if we have a prompt 
     let hasPrompt = !!this.get('prompt'); 
     let contentIndex = hasPrompt ? selectedIndex - 1 : selectedIndex; 
     let _selection = content[contentIndex]; 

     this.sendAction('willChangeAction', _selection); 

     if (this.get('optionValuePath')) { 
     this.set('selection', _selection[this.get('optionValuePath')]); 
     } else { 
     this.set('selection', _selection); 
     } 

     this.sendAction('didChangeAction', _selection); 
    } 
    } 
}); 

и изменить значение ... Я получаю эту ошибку:

идентификатор записи, то не может быть изменена после него находится в загруженном состоянии

Как вы собираетесь обновлять автомобиль Jaguar 2015 года ord для изменения владельца и загрузки деталей нового владельца?

+0

Какой компонент вы используете? Мне любопытно, потому что это изменяет правильность настройки компонента в моем ответе. – xcskier56

+0

обновленный вопрос, чтобы отразить код компонента. – Matt

ответ

0

Вы меняете идентификатор владельца вместо замены опоры owner_id на ягуаре. Я изменил owner_id опору на owner, чтобы уточнить, что принадлежит принадлежит.

Общая стратегия, которую я принимаю, - это выбрать владельца автомобиля, а затем передать это обратно контроллеру, чтобы сохранить автомобиль.

модели/car.js

export default Model.extend({ 
    "owner": DS.belongsTo('owner'), 
    // ... 
}) 

маршруты/автомобили/car.js

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model(params) { 
    return Ember.RSVP.hash({ 
     car: this.store.find('car', params.id), 
     ownerList: // however you get the owner list 
    }) 
    } 
}) 

Контроллеры/Автомобили/car.js

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    actions{ 
    ownerChanged(newOwner) { 
     // If the select is setup properly, newOwner should be an instance of owner. 
     const car = this.get('model.car'); 
     car.set('owner', newOwner); 
     car.save 
    } 
    } 
}) 

шаблоны/Автомобили/автомобиль. HBS.

{{my-select 
    name="owner" 
    content=model.ownerList 
    selection=model.car.owner.id 
    prompt="select an owner" 
    required=true 
    didChangeAction='ownerChanged' 
}} 

код в модели крючке маршрута в основном там для ясности, если вы принимаете другой подход, скорректировать имена соответственно

+0

В теории это имеет смысл ... однако selection = model.car.owner.id относится к автомобилю doc, имея «владельца» ..., принадлежащего владельцу doc ... и внутри документа владельца id '12345' selection = '12345', который возвращает правильного владельца. (обратите внимание, что в документе doc владелец уже будет равен «12345» в качестве сохраненного идентификатора. Момент, когда я меняю выбор, это то, где я получаю ошибку. Я предполагаю, что у меня есть разрыв, как вы меняете идентификатор «владельца», и по-прежнему сохраняйте новый идентификатор в документе doc. Мне нужно изменить идентификатор владельца (car doc), и найти владельца документа для нового идентификатора. – Matt

1

Вы получаете сообщение об ошибке, потому что изменение соответствующей модели А модель влечет за собой установку атрибут отношения к другой модели и не меняет идентификатор соответствующей модели.

xcskier56 правильно, что вы должны объявить ваши отношения как:

"owner": DS.belongsTo('owner')

Это имеет смысл, потому что теперь вы называете car.owner.id или car.owner.name, а не car.owner_id.id или car.owner_id.name.

Теперь, если вы хотите сменить владельца автомобиля, вы не можете сделать car.set('owner.id', newId);. Вы должны изменить модель, а не идентификатор, например: car.set('owner', newOwner);

И для использования выбора, чтобы изменить владельца, вы можете использовать отдельные аддоны, которые поддерживают объекты/модели в качестве параметров (ember-power-select), или сделайте свое, похожее на предложение xcskier56.

+0

Ahhh ok. Простите меня за путаницу. Спасибо за разъяснение. – Matt

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