2014-06-05 7 views
6

W kontrolerze:Ember Data deleteRecord(), po której następuje wycofanie() - jak przywrócić obiekt do listy?

actions: { 

     selectDelete: function(note) { 
      console.log('selectDelete', note); 
      note.deleteRecord(); 
      note.save().then(
       function success() { 
        console.log('Deleted successfully'); 
       }, function failure() { 
        console.log('Delete error before', 
         this.get('isDeleted'), this.get('isDirty'); //true, true 
        // note.transitionTo('loaded.saved'); //also has same effect 
        note.rollback(); 
        console.log('Delete error after', 
         this.get('isDeleted'), this.get('isDirty'); //false, false 
       } 
      ); 
     }, 
    } 

w szablonie:

{{#each note in model.notes}} 
<li> 
    <span>{{note.text}}</span> 
    <span {{action 'selectDelete' note}}>[Delete]</span> 
</li> 
{{else}} 
No Notes 
{{/each}} 

Teraz po kliknięciu na rozpiętości [Delete], akcja selectDelete zostanie uruchomiony, z następującym wyjścia:

Delete error before true true 
Delete error after false false 

... co oznacza, że ​​wycofanie się powiodło, a rekord rzeczywiście nie został usunięty.

Jednak podczas wywoływania deleteRecord() aktualizuje DOM usunąć część reprezentującą usunięty rekord, wzywającą rollback() wydaje się cofnąć zmiany do zapisu w pamięci, ale nie cofnąć zmiany w DOM.

Jak mogę zapewnić, że rollback() powoduje tę zmianę?

Alternatywnie, czy istnieje sposób, aby zmienić domyślne zachowanie takie, że deleteRecord() nie powoduje zmiany w DOM, i zamiast pozostawia bez zmian, odroczenie tej zmiany, dopóki success zwrotna nazywa? (W ten sposób A powracając zmiany DOM nie będzie konieczne)

+0

Wszystko działa zgodnie z oczekiwaniami podczas korzystania z this.store.find ("użytkownik") http://emberjs.jsbin.com/dibake/1/edit. Opierając się na moim jsbin można replikować swoją skrzynkę (konfiguracja konkretnych modeli, fałszywe odpowiedzi ...), myślę, że problem może być błąd podczas iteracji relacji hasMany. – ppcano

+0

@ppcano 'deleteRecord()' does * not * faktycznie usuwa rekord lub wysyła żądanie HTTP do serwera. Dzieje się tak tylko przy 'save()'. Dlaczego wywołujesz 'deleteRecord()' w akcji 'del', ale wywołuj' save() 'w akcji' restore'? – bguiz

+0

Właśnie testowałem twój przypadek użycia. – ppcano

Odpowiedz

1

To prawdopodobnie dlatego, że rekord został usunięty z modelu trasie za (aka vislble lista), ale nie ze sklepu (cache dla widoczny & non -widoczne modele.)

Spróbuj ponownie ręcznie naciskając na route.model.

route.get('model').pushObject(note); 
+1

Możesz również zapisać lokalizację przed usunięciem, aby móc ją przenieść z powrotem do tego samego miejsca. – Louy

Powiązane problemy