2013-04-04 12 views
5

Używanie najnowszych danych Ember i Ember.Jak mogę ignorować brudne rekordy podczas odświeżania listy z serwera?

Mam jedną stronę aplikacji z listą pozycji i możliwość otwierania pozycji w kartach. Mogę edytować elementy w otwartych zakładkach i bez zatwierdzania brudnego rekordu, wróć do listy.

Gdybym odświeżyć listę, pojawia się błąd:

Error: Attempted to handle event loadedData on <> while in state rootState.loaded.updated.uncommitted

Jest to oczywiście dlatego, że zrobili App.TestObject.find() na liście, a jeszcze brudne niezatwierdzone rekordy (otwierać i edytować rekordy w zakładkach).

Moim celem jest pokazanie listy ze zaktualizowanymi zapisami, ale nie rób nic z niezamierzonymi zapisami. Nie chcę wykonywać wycofywania na niezamawianych rekordach. Czy jest to najlepsza praktyka?

This is a similar question, ale nie chcę przywracać oryginalnych danych. This is a similar case with a fiddle, ale tutaj wycofanie jest właściwym rozwiązaniem.

Jak mogę rozwiązać skrzypce, jeśli chcę zignorować niezatwierdzone rekordy, gdy wrócę do listy?

Odpowiedz

5

Mam tylko obejście tego problemu przez łatanie małpy DS.Model.

DS.Model.reopen({ 
    loadedData: function() { 
    if (this.get('isDirty') === false) { 
     this._super.apply(this, arguments); 
    } 
    } 
}); 

wynikającej z powyższego modelu, aby nie aktualizuje się automatycznie, gdy w brudnym stanie, bez względu na to, co jest w nowym JSON dotyczących tego rekordu. Pozostałe rekordy będą się same aktualizować.

4

Jeśli nie chcesz małpa plastra DS.Model.loadedData, oto inne rozwiązanie:

App.Contact.reopenClass({ 
    // Results of our find() call. 
    cache: null, 

    // Either find our data for the first time, or refresh what we have. 
    findAllWithRefresh: function() { 
     if (this.cache === null) { 
      this.cache = this.find(); 
     } else { 
      this.cache.forEach(function (c) { 
       // This appears to be a correct list of conditions for calling 
       // refresh(), but you may need to tweak it. 
       if (c.get("isLoaded") && !c.get("isSaving") && !c.get("isError") && !c.get("isDeleted") && !c.get("isDirty") && !c.get("isReloading")) { 
        console.log("Refreshing", c); 
        c.reload(); 
       } else { 
        console.log("Can't refresh", c); 
       } 
      });   
     } 
     return this.cache; 
    } 
}); 

App.ContactsRoute = Ember.Route.extend({ 
    model: function (params) { 
     // Note that we won't see any new records using this approach. 
     return App.Contact.findAllWithRefresh(); 
    } 
}); 

Oto working jsFiddle.

Podstawowym problemem jest to, że nie można bezpiecznie zadzwonić pod numer App.Contact.find(), gdy istnieją zapisy z niezatwierdzonymi zmianami. To wydaje się być problemem projektowym w Ember Data.

+1

Wygląda na to, że takie podejście wygeneruje DUŻO XHRs na serwerze. Biorąc pod uwagę listę 150 elementów, w których zero lub tylko jeden rekord jest brudny, spowoduje to 149 lub 150 XHR ... –

Powiązane problemy