Ember-Data: Wie man 'DS.Adapter.findHasMany' benutzt

9

AKTUALISIEREN

Beachten Sie, dass diese Frage für die Beta-Version von Ember Data vor Version 1.0 gilt. Der Mechanismus zum Laden von Beziehungen über die URL hat sich nach der Beta-Version von Version 1.0 erheblich geändert!

Ich habe vor einiger Zeit eine viel längere Frage gestellt, aber da sich die Bibliothek seitdem geändert hat, werde ich eine viel einfachere Version fragen:

Wie benutzt du DS.Adapter.findHasMany ? Ich baue einen Adapter und ich möchte in der Lage sein, den Inhalt einer Beziehung auf get der Beziehungseigenschaft zu laden, und dies sieht wie die Art, es zu tun. Betrachtet man jedoch den Ember-Data-Code, sehe ich nicht, wie diese Funktion jemals aufgerufen werden kann (ich kann dies bei Bedarf in Kommentaren erläutern).

Es gibt keinen einfachen Weg mit meinem Backend, ein Array von IDs in den Property-Schlüssel in dem JSON aufzunehmen, den ich sende - der Serializer, den ich benutze, lässt mich nirgends einhaken, das zu ändern wäre auch rechenintensiv.

Es war einmal die Ember-Daten-Startseite, die ein Beispiel für das "Lazy Loading" zeigte ... Ist das möglich, oder ist das "Handle partially-loaded records" wie in der Roadmap angegeben, und kann nicht doch fertig sein.?

Ich bin auf API-Revision 11, Master-Zweig ab dem 15. Januar.

Aktualisieren

Okay, das Folgende funktioniert meistens. Zuerst habe ich die folgende Methode findHasMany in meinem Adapter basierend auf der Implementierung des Testfalls erstellt:

%Vor%

Voraussetzung dafür ist, dass Sie eine gut funktionierende extractId -Methode in Ihrem Serializer haben müssen, aber die eingebaute von RESTAdapter wird wahrscheinlich in den meisten Fällen funktionieren.

Dieses funktioniert , hat aber ein signifikantes Problem, das ich bei diesem Lazy-Loading-Ansatz noch nicht richtig verstanden habe: Wenn der ursprüngliche Datensatz vom Server neu geladen wird, alles geht in den Topf. Der einfachste Anwendungsfall, der dies zeigt, ist, wenn Sie einen einzelnen Datensatz laden, dann hasMany abrufen und dann alle die übergeordneten Datensätze laden. Zum Beispiel:

%Vor%

Im Fall von nur dem obigen Code passiert, dass wenn Ember Data den Datensatz re-materialisiert, er erkennt, dass bereits ein Wert im Datensatz war ( posts/1 ), versucht ihn erneut zu füllen, und folgt ein anderer Codepfad , der die URL-Zeichenfolge im JSON-Hash als ein Array von Einzelzeichen-IDs behandelt . Insbesondere wird der Wert von JSON an Ember.EnumerableUtils.map übergeben, wodurch die Zeichen der Zeichenfolge verständlicherweise als Array-Elemente aufgelistet werden.

Daher habe ich versucht, dies zu umgehen, indem ich DS.Model.hasManyDidChange "patche", wo dies geschieht, so:

%Vor%

(Vergiss es, das war eine wirklich schlechte Idee.)

Update 2

Ich fand, dass ich (mindestens) eine Sache mehr machen musste, um das oben erwähnte Problem zu lösen, wenn ein Elternmodell vom Server neu geladen wurde. Der Codepfad, in den die URL in einzelne Zeichen aufgeteilt wurde, war in DS.Model.reloadHasManys . Also überging ich diese Methode mit dem folgenden Code:

%Vor%

Damit ist die Verwendung URL-basierter hasManys fast verwendbar, mit zwei verbleibenden Hauptproblemen:

Erstens funktionieren die inverse belongsTo Beziehungen nicht korrekt - Sie müssen sie alle entfernen. Dies scheint ein Problem mit der Art zu sein, wie RecordArrays mit ArrayProxies ausgeführt werden, aber es ist kompliziert. Wenn der übergeordnete Datensatz neu geladen wird, werden beide Beziehungen zum "Entfernen" verarbeitet. Während also eine Schleife über das Array iteriert, entfernt der Zugehörigkeitscode zum Entfernen gleichzeitig Objekte aus dem Array, und dann flippt die Schleife aus, weil sie versucht, darauf zuzugreifen ein Index, der nicht mehr da ist. Ich habe das noch nicht herausgefunden, und es ist hart.

Zweitens ist es oft ineffizient - am Ende werde ich die hasMany vom Server zu oft neu laden ... aber zumindest kann ich das umgehen, indem ich ein paar Cache-Header auf der Serverseite sende.

Wenn jemand versucht, die Lösungen in dieser Frage zu verwenden, schlage ich vor, dass Sie den obigen Code zu Ihrer App hinzufügen, damit Sie schließlich irgendwo hinkommen. Aber das muss wirklich in Ember Data behoben werden, damit es richtig funktioniert, denke ich.

Ich hoffe, dass dies irgendwann besser unterstützt wird. Auf der einen Seite sagt die JSONAPI Richtung, die sie gehen, dass diese Art von Sache Teil der Spezifikation ist. Auf der anderen Seite hat Ember Data 0.13 (oder rev 12?) Das serialisierte Standardformat geändert, so dass Ihre URL in einer JSON-Eigenschaft namens *_ids ... sein muss, z. child_object_ids ... wenn es nicht einmal IDs gibt, die du in diesem Fall sendest! Dies scheint darauf hinzudeuten, dass die Verwendung eines Arrays von IDs in der Liste der Anwendungsfälle nicht hoch ist. Alle Ember Data-Entwickler, die das lesen: BITTE UNTERSTÜTZEN SIE DIESE FUNKTION!

Willkommen weitere Gedanken dazu!

    
S'pht'Kr 17.01.2013, 15:32
quelle

4 Antworten

2

Anstelle eines Arrays von IDs muss die Nutzlast "etwas anderes" als ein Array enthalten.

Im Fall von RESTAdapter ist das zurückgegebene JSON wie folgt:

%Vor%

Wenn Sie die Zuordnung manuell / anders handhaben möchten, können Sie stattdessen einen JSON wie diesen zurückgeben:

%Vor%

Es liegt an Ihrem Adapter, die Daten von der angegebenen URL abzurufen.

Siehe den zugehörigen Test: Ссылка

    
Cyril Fluck 14.04.2013, 15:57
quelle
1

Ich war froh, diesen Beitrag zu finden, hat mir geholfen. Hier ist meine Version, basierend auf den aktuellen Ember-Daten und deinem Code.

%Vor%

für das Problem beim erneuten Laden, habe ich dies, basierend auf Code, den ich an einer anderen Stelle gefunden habe, innerhalb des Serialisierers, den ich überschrieben habe:

%Vor%

Ich arbeite immer noch daran, Paging auszuarbeiten, da einige der Sammlungen, mit denen ich arbeite, es brauchen.

    
sfossen 13.06.2013 02:57
quelle
0

Hier ist meine Lösung, aber es ist auf Ember-Daten 0.14, also ist die Welt weitergezogen, auch wenn wir noch auf dieser Codebasis stehen:

%Vor%

Ich fand das Ersetzen der Daten durch die IDs, die für mich gearbeitet haben.

    
dagda1 12.02.2014 06:36
quelle
0

Ich bin einen kleinen Schritt näher daran gekommen, dass es mit Revision 13 funktioniert und mich auf sfosses findHasMany-Implementierung stützt.

Für ein Ember-Modell 'Autor' mit einer hasMany-Beziehung 'blogPosts' sieht meine Rest-API wie '/ api / authors /: author_id / blog_posts' aus. Wenn Sie die Rest-API für einen Autor mit der ID 11 abfragen, liest das Feld blog_posts '/ authors / 11 / blog_posts'.

Ich sehe nun, dass die verwandten Blog-Posts vom Server zurückgegeben werden, aber Ember wirft immer noch einen obskuren Fehler auf, dass er beim Rendern der Seite "ID" nicht von einem undefinierten Modellobjekt lesen kann. So bin ich noch nicht ganz da, aber zumindest werden die zugehörigen Daten vom Rest-Service korrekt angefordert.

Mein kompletter Adapter:

%Vor%     
jonne 23.06.2013 14:02
quelle

Tags und Links