Como reverter as alterações de relacionamento em EmberData
Eu tenho dois modelos com relacionamento pai-filho: treinamento e exercício:
App.Training = DS.Model.extend({
exercises: DS.hasMany('App.Exercise')
})
App.Exercise = DS.Model.extend({
training: DS.belongsTo('App.Training')
})
Eu quero ter uma página onde um treinamento com todos os seus exercícios relacionados é exibido. Se o usuário pressionar oEdit
botão, a página torna-se editável com a possibilidade de adicionar novos exercícios. Eu também quero ter umCancel
botão que descarta todas as alterações feitas.
Aqui está meu controlador:
App.TrainingsShowController = Em.ObjectController.extend({
editing: false,
edit: function() {
this.set('editing', true);
transaction = this.get('store').transaction();
transaction.add(this.get('model'));
this.get('model.exercises').forEach(function(x){
transaction.add(x);
});
},
cancel: function() {
this.set('editing', false);
this.get('model.transaction').rollback();
},
save: function() {
this.set('editing', false);
this.get('model.transaction').commit();
},
addExercise: function() {
this.get('model.exercises').createRecord({});
}
})
Existem quatro manipuladores de eventos no controlador:
edit
: O usuário pressionou oEdit
botão: uma transação é criada, a página é colocada no modo "Edição".cancel
: O usuário pressionou oCancel
botão: transação é revertida e volta ao modo "Normal".save
: O usuário pressionou oSave
botão: transação é confirmada e volta ao modo "Normal".addExercise
: O usuário pressionou oAdd exercise
Botão: um novo exercício é criado (na mesma transação) e adicionado aos treinamentos.A funcionalidade de reversão funciona bem, exceto para registros recém-criados: se eu pressionar oEdit
botão, adicionar um novo exercício e empurre oCancel
botão, o exercício recém-criado fica na página.
Qual é a melhor maneira de se livrar do registro infantil descartado?
ATUALIZAR:
Eu criei um jsFiddle para reproduzir o problema, mas funcionou. Ao contrário do meu aplicativo aqui eu useiDS.FixtureAdapter
: http://jsfiddle.net/tothda/LaXLG/13/
Então eu criei um outro usandoDS.RESTAdapter
e o problema apareceu:http://jsfiddle.net/tothda/qwZc4/5/
No violino, tente: Editar, Adicionar novo e, em seguida, Reverter.
Eu descobri que, no caso do RESTAdapter, quando eu adiciono um novo registro filho a umhasMany
relacionamento, o registro pai não ficará sujo. O que parece bom, mas quando eu reverter a transação, o registro filho recém-criado permanece no paiManyArray
.
Eu ainda não sei qual é a melhor maneira de lidar com a situação.