2013-09-14 3 views
5

Когда я звоню deleteRecord() по некоторым из моих отношений hasMany, Ember Data отправляет (успешный) DELETE запрос, но запись не удаляется из представления. Я отображая его с помощью render помощника, как это:deleteRecord не удаляет запись из hasMany

{{render "modules.list" modules}} 

Интересно то, что Эмбер инспектор показывает, что после того, как deleteRecord() соответствующий объект <App.Module:ember1182:null> и его родитель null тоже. Однако он родитель, но все же показывает запись в своем hasMany (как <App.Module:ember1182:null>). Когда я перезагружаю страницу, а затем звоню deleteRecord(), она удаляется из представления, как ожидалось.

Похоже, что deleteRecord() не удаляет запись из массива родителя hasMany. Как ни странно, это прекрасно работает в других частях моего кода. Одна из моих теорий заключается в том, что это связано с помощником {render}, потому что везде, где я использую эту проблему, у меня такая же проблема, но я не уверен, что это вызывает проблему.

Я использую последнюю сборку данных ember (commit 2511cb1f77).

ответ

9

Я нашел решение. Похоже, deleteRecord звонит clearRelationships, который, в свою очередь, устанавливает belongsTo модели null. Однако он не очищает обратную (т. Е. Не удаляет модель из отношения родителя) hasMany. Следующий код исправил это.

var model = this.get('model'); 
model.eachRelationship(function(name, relationship){ 
    if (relationship.kind === "belongsTo") { 
     var inverse = relationship.parentType.inverseFor(name); 
     var parent = model.get(name); 
     if (inverse && parent) parent.get(inverse.name).removeObject(model); 
    } 
}); 
this.get('model').deleteRecord(); 
this.get('model').save(); 

Однако, на мой взгляд, это должно обрабатываться Ember (Data). Кажется, что это (в большинстве случаев), так как это отлично работало в других частях моего кода. Вероятно, такая ситуация является своего рода краевым случаем. Любые мысли о том, что может происходить, очень ценятся.

+0

Я новичок в Ember Data, но мне пришлось сохранять родительский объект после вызова removeObject. @chopper, если это необходимо? –

+0

Лучше всего угадать, что у вас есть 2 потенциальные обратные отношения, поэтому ember не знает, с чего его удалить ... хотя, в этом случае, поскольку вы удаляете его, он должен удалять все, в идеале. –

+0

Это решение перестало работать для меня, когда я перебрался в ember-cli, поэтому я задал еще один вопрос об этом здесь: http://stackoverflow.com/questions/24644902/deleterecord-with-multiple-belongsto-relationships-in-ember- cli Является ли этот ответ еще одним подходом, который я должен попробовать? Благодаря! –

0

Вот рабочий JSBin демонстрирует общую идею удаления элементов: http://jsbin.com/ucanam/1059/edit

Вы можете разместить пример то, что дает вам проблемы?

+1

Спасибо Джереми, но я хорошо знаком с тем, как удаляются записи. На самом деле настройка у меня очень похожа на то, что вы разместили. К сожалению, для меня нет хорошего способа собрать скрипку, поскольку мое дело связано с сообщением с моим бэкэндом. Выше это действительно лучшее описание, которое я могу дать. Кажется, что в моем случае запись не удаляется из родительского массива hasMany. На данный момент я даже не знаю, как сузить проблему. Любые предложения для этого были бы замечательными! – chopper

1

Кажется, что установка параметра inverse в соотношении belongsTo фиксирует его без необходимости чистки отношения вручную в Ember Data 0.14.

App.Item = DS.Model.Extend({ 
    parent: belongsTo('parent', { inverse: 'items' }) 
}); 

Так что, если вы инстанцируете модель ребенка через его родители, как следующее:

App.ParentController = Ember.ObjectController.extend({ 
    actions: { 
    add: function() { 
     this.get('items').pushObject(this.store.createRecord('item')); 
    } 
    } 
}); 

Любое дальнейшее обращение к созданной Item методы deleteRecord экземпляра будет удалить его из родительского отношения и удалить его правильно из вид.

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