2013-07-02 5 views
6

Ich verwende eine einfache Ember.ArrayController in einer Anwendung mit ember-data (neueste), ember rc6 und einem Lager REST-Controller.deleteRecord aktualisiert ArrayController nicht, wenn Modell gefiltert wird

Ich habe Aktionen neben jedem Element in der vom Array-Controller gerenderten Liste löschen. Wenn ein Element gelöscht wird, wird der entsprechende REST-API-Aufruf ausgeführt und ordnungsgemäß aus der Datenbank entfernt. Der Server antwortet mit der korrekten Antwort 204.

Hier ist mein Router-Setup, bemerkt der Fund Filter

angewendet wird
App.CategoriesIndexRoute = Ember.Route.extend({ 
    setupController : function(controller, model) { 
     this._super(controller, model); 

     controller.set("content", App.Category.find({ 
      "parent": null, 
     })); 
    } 
}); 

Wenn ich den Fund Filter entfernen und alle Kategorien laden, funktioniert alles einwandfrei (Artikel automatisch aus der Liste entfernt wird unmittelbar nach Festschreibung). Wenn ich den Filter jedoch so hinzufüge, dass nur Kategorien angezeigt werden, die kein übergeordnetes Element aufweisen, wird die Liste beim Löschen eines Elements nicht aktualisiert. Wenn ich zu einem anderen Abschnitt übergehe und zurückkomme, wird die Liste neu geladen und die Kategorie ist weg.

Hier ist deleteCategory Methode im ArrayController:

deleteCategory: function(category) { 
    var transaction = this.get("store").transaction(); 

    transaction.add(category); 
    category.deleteRecord(); 
    transaction.commit(); 
} 

Ist dies ein ember-data oder emberjs Bug? Wenn nicht, was mache ich hier falsch? Wenn es sich um einen Fehler handelt, gibt es eine Möglichkeit, den ArrayController-Inhalt nach dem Löschen eines Elements zwangsweise neu zu laden? Kann ich die Kategorie auch manuell aus dem ArrayController entfernen?

UPDATE 1:

ich es geschafft, den Array-Controller den Inhalt zu erzwingen-Update durch seinen Inhalt Einstellung:

category.one("didDelete", this, function() { 
    this.set("content", App.Category.find({ 
     parent: parent_category 
    })); 
}); 

UPDATE 2:

Hier ist, wie ich die Liste der Elemente bin Anzeige in der Vorlage:

{{#each category in controller.content }} 
<tr> 
    <td><a {{ action "detailCategory" category }}>{{ category.name }}</a></td> 
    <td><a {{ action "deleteCategory" category }}>Delete</a></td> 
</tr> 
{{/each}} 

Vielen Dank!

+0

Zwei Anmerkungen: Ich habe dies mit anderen Arten von Filtern getestet, und es schlägt fehl, wenn ein Filter auf die Modellabfrage angewendet wird. Es funktioniert nur ohne Filter, ansonsten wird die Liste nicht aktualisiert. Ich habe auch eine Möglichkeit gefunden, die Abfrage des ArrayControllers zwangsweise neu zu laden, indem ich den Inhalt nach Abschluss des Löschvorgangs festlege. Dies wird für jetzt tun, aber es ist ein hässlicher Hack. –

+0

Ich habe ein ähnliches Problem. Hast du das jemals gelöst? –

+0

Ich habe dieses Problem bis zu den Kontrollkästchen verfolgt, die ich neben jedem Element in der Liste hatte. Jedes Kontrollkästchen war an ein Attribut des zugehörigen Objekts gebunden, und es traten beim Laden der Liste fehlerhafte Ereignisse auf, die dieses Problem verursachten. Ich habe die Checkboxen und damit verbundenen Ereignisse entfernt, um das Problem zu beheben. Wenn Sie mehr Details benötigen, werde ich weiter graben und Sie wissen lassen. –

Antwort

0

Dies ist nicht mehr die Art, Dinge in Ember Data zu tun. Man kann keine Transaktionen mehr verwenden, wie in der Transition-Dokument: https://github.com/emberjs/data/blob/master/TRANSITION.md

+0

Ich habe meine Frage gelöscht, und ich kann Ihre nicht akzeptieren, weil ich nicht derjenige bin, der fragte :) Sie sollten Taylan Pince Bug ... – intuitivepixel

+0

Ja, jeder Kommentar "Bugs" der OP, wenn ich Stapelüberlauf richtig verstehe. .. ich bin mir nicht sicher, auf welche Frage du dich beziehst, sorry, aber alles gut :) Stacküberlauf ist nervig, wenn du alte Sachen rausräumen willst, habe ich gefunden. "beantwortet" bedeutet "beantwortet und diese Antwort akzeptiert". –

Verwandte Themen