2013-01-13 16 views
13

Mam ArrayController którego treść jest zdefiniowana w trasie tak:Lista nie aktualizowane po deleteRecord

App.UsersRoute = Ember.Route.extend({ 
    model: function() { 
    return App.User.find(); 
    }, 

    setupController: function(controller, model) { 
    this._super(controller, model); 
    this.controllerFor('application').set('currentRoute', 'users'); 
    } 
}); 

I listy danych w szablonie:

<ul> 
    {{#each user in arrangedContent}} 
    <li> 
    {{user.lastName}} {{user.firstName}} 
    {{#linkTo "users.edit" user class="btn btn-primary btn-small"}}EDIT{{/linkTo}} 
    </li> 
    {{/each}} 
</ul> 

To działa dobrze.

Jeśli utworzyć nowy element, zostanie on automatycznie dodany do listy w szablonie:

App.UsersNewRoute = Ember.Route.extend({ 
    model: function() { 
    return App.User.createRecord({firstName: '', lastName: ''}); 
    } 
}); 

Ale kiedy usunąć element w widoku „edytuj”, to nie działa:

App.UsersEditController = Ember.ObjectController.extend({ 
    ... 

    destroy: function() { 
    this.get('content').deleteRecord(); 
    this.get('store').commit(); 
    this.transitionToRoute("users.index"); 
    } 
}); 

Ale w widoku "nowy", jeśli usunę nowo utworzony element, działa (bez zatwierdzenia).

W edytorze edycji, jeśli usunę "zatwierdzenie", lista zostanie zaktualizowana, ale kiedy wykonam kolejną akcję, lista zostanie ponownie załadowana, a usunięty element ponownie pojawi się (normalnie).

Jak usunąć element?

UWAGA: Używam "głównego" kodu danych embers i ember, odświeżonego właśnie teraz.

+1

Już napotkałem ten sam rodzaj problemu. Przypuszczam, że jeśli odświeżysz stronę, usunięty element już tu nie będzie? Chociaż podczas zatwierdzania istnieje odpowiedź serwera, która wciąż zawiera ten rekord? –

+1

TAK! To jest błąd. W serwerze railsowym zwróciłem zniszczony obiekt z "render json: user". Z "render json: zero, status:: ok", jest OK! Wielkie dzięki. –

+1

Dobrze :), rzeczywiście jest to dość trudny do śledzenia błąd. Ten sam rodzaj zachowania może nadejść, jeśli utworzysz/usuniesz dziecko i zmodyfikujesz rodzica w tym samym czasie. (W przypadku hasMany/belongs) 2 żądania trafiają na serwer, ale modyfikacja rodzica jest uruchamiana przed usunięciem dziecka.W rezultacie, w przypadku danych Ember, gdy przychodzi odpowiedź rodzica, zawsze ma ono dziecko ... bum ... –

Odpowiedz

1

Powinieneś również przejść tylko po usunięciu rekordu, ponieważ zatwierdzanie odbywa się asynchronicznie.

var user = this.get("content"); 

user.one("didDelete", this, function() { 
    this.transitionTo("users.index"); 
}); 

user.deleteRecord(); 
user.get("transaction").commit(); 

Należy również pamiętać, że dodanie transakcji jest preferowane przed wprowadzeniem do sklepu. Jeśli później zdecydujesz się dodać rekord do swojej własnej transakcji, będziesz miał mniej pracy do wykonania, a jeśli tego nie zrobisz, to nadal będzie używał tego samego defaultTransaction, tak jak w przypadku sklepu.

2

Po prostu doświadczyłem podobnej kwestii w bardzo różnych okolicznościach.

Używam "grunt-ember-boilerplate" (bardzo zalecane, jeśli używasz CoffeeScript i Ember). Przyszedł z wersją Ember Data, która miała dziwny błąd, w którym prawidłowo usunięte rekordy pozostałyby w pamięci podręcznej, a zatem nie zostały usunięte z list.

Nie miałem czasu, aby dowiedzieć się dokładnie, co się dzieje; więc po prostu próbowałem pobrać najnowszą wersję Ember Data (2013-05-10 10:20:34 -0700) i to od razu rozwiązało problem.

Po prostu publikuj tutaj, na wypadek, gdyby ktoś napotkał podobny problem.

Zgadzam się również z Jakubem Arnoldem, który mówi, że nie powinien "przechowywać" i używać detektorów zdarzeń, aby zapewnić czysty stan. Właśnie dzisiaj znalazłem bardzo przydatny wpis na blogu na ten temat: "Patterns and anti-patterns for Ember Data".

Powiązane problemy