2014-01-10 15 views
18

I Modelle haben wie folgt definiert:Durchführung Rollback auf Modell mit hasMany Beziehung

App.Answer = DS.Model.extend({ 
    name: DS.attr('string'), 
    layoutName: DS.attr('string') 
}); 

App.Question = DS.Model.extend({ 
    name: DS.attr('string'), 
    answers: DS.hasMany('answer', {async: true}) 
}); 

Ich habe eine Komponente, das Modell in Frage zu stellen zum Löschen und Hinzufügen von Antworten ermöglicht. Die Komponente kommt mit der Schaltfläche zum Anwenden und Abbrechen, und wenn der Benutzer auf Abbrechen klickt, wollte ich, dass alle Änderungen (Hinzufügen/Löschen von Antworten) rückgängig gemacht werden. Derzeit Rollback nicht den Trick, I-Ereignis versucht model.reload() bei der Verwendung Rest-Adapter und das hat auch nicht für mich arbeiten. Irgendeine Idee, wie ich in dieser Situation einen Rollback machen kann?

Wenn der Rest-Adapter, ich ziemlich viel fallen auf die Frage an dieser Stelle darauf: EmberJS cancel (rollback) object with HasMany

Danke, Dee

UPDATE:

Da ich nicht durchführen konnte die beabsichtigte Art und Weise Rollback , Führte ich diese Schritte aus:

1) get all the answers back from the server 
2) remove answer association from the question 
3) manually add answer association to the question model from data received from server 

Dies scheint gut zu funktionieren aber leider Ich bekomme diesen einen Fehler, den ich nicht abschütteln kann. Hier

ist ein jsbin aktualisierter Fortschritt: http://jsbin.com/uWUmUgE/2/

Hier können Sie neue Antwort erstellen und dann hängen Sie ihn in Frage zu stellen und zu tun Rollback. ABER, wenn Sie diese Schritte befolgen, werden Sie das Problem sehe ich bin vor:

1) delete an answer 
2) add an answer 
3) perform rollback 
4) add an answer 

Es wirft diesen Fehler: Fehler: Versuchte Ereignis didSetProperty auf, während Handhabung im Zustand root.deleted.uncommitted. Mit {name: position, oldValue: 1, originalValue: 1, value: 2} aufgerufen.

Ich werde jede Hilfe schätzen, die Sie zur Verfügung stellen können.

Behelfslösung:

Eine einfache Abhilfe war nur die Antworten auf Löschen verstecken. Ich änderte das Modell ein bisschen wie:

App.Answer = DS.Model.extend({ 
    name: DS.attr('string'), 
    layoutName: DS.attr('string'), 
    markToDelete: DS.attr('boolean', {default: false}) 
}); 

Und meine Rollback-Funktion, diese Logik hatte:

answers.forEach(function (answer) { 
    if(!answer.get('id')){ 
     //newly created answer models that has not persisted in DB 
     question.get('answers').removeObject(answer); 
     answer.deleteRecord(); 
    } else { 
     answer.rollback(); 
    } 
}); 

Antwort

2

Ich bin nicht sicher, ob Ihr Umfang aber für diese Beziehung (Ich rolle tatsächlich wieder die belongsTo hier, aber ich bin neugierig, ob diese in irgendeiner Weise hilft)

App.Appointment = DS.Model.extend({ 
     name: DS.attr('string'), 
     customer: DS.belongsTo('customer', {async: true}) 
    }); 

    App.Customer = DS.Model.extend({ 
     name: DS.attr('string'), 
     appointments: DS.hasMany('appointment', {async: true}) 
    }); 

ich in der Lage bin, sowohl die Ernennung rückgängig zu machen und es ist Modell hasMany Kunden wie so (aus meiner Strecke)

App.AppointmentRoute = Ember.Route.extend({ 
actions: { 
    willTransition: function(transition) { 
    var context = this.get('context'); 
    var dirty =context.get('isDirty'); 
    var dirtyCustomer=context.get('customer.isDirty'); 
    var message = "foo"; 
    if ((dirty || dirtyCustomer) && confirm(message)) { 
     transition.abort(); 
    }else{ 
     context.get('customer').get('content').rollback(); 
     context.rollback();return true; 
    } 
} 
}); 
+0

Hallo @Toran danke für die Antwort. Wenn ich versuche, in meiner Komponentenaktion, die den Rollback behandelt, Kontext zu erhalten, wird die Komponenteninstanz selbst zurückgegeben. Was bekommst du in deinem Kontext? –

+0

Ach, tut mir leid, mein Beispiel ist innerhalb einer Route (Ich habe noch nichts mit einer Komponente zu tun, also bin ich mir nicht sicher, wie das ähnlich wäre oder nicht) –

Verwandte Themen