Die AngularJS-Factory-Eigenschaft wird nicht in $ scope aktualisiert, wenn push () nicht verwendet wird.

8

Ich habe eine Factory, die die Daten von einer externen Quelle abruft. Sobald ich die Daten bekomme, benutze ich eine zweite Fabrik, um sie nach bestimmten Kriterien zu filtern.

Die Factory-Eigenschaft ist dem Bereich zugewiesen.

Wenn ich das jetzt in meiner Fabrik mache, wird der Bereich nicht aktualisiert:

%Vor%

dafür funktioniert auch das filterin in einer zweiten Fabrik nicht

%Vor%

solange das funktioniert:

%Vor%

Hat jemand eine Idee, wenn das beabsichtigt ist und warum es so ist und wie man es löst?

Volle Probe plus Plunkr

%Vor%

Plunkr

    
Kilian Schefer 02.09.2013, 08:06
quelle

2 Antworten

12

Das Problem ist, dass Ihr Werk den Verweis auf Factory.foo ersetzt. Wenn Ihr Bereich initialisiert wird, enthält $scope.foo einen Verweis auf ein Array (leer). Wenn Sie Foo.getDataForFoo aufrufen, ändert es intern den Verweis auf Factory.foo , aber Ihr Bereich enthält immer noch einen Verweis auf das vorherige Array. Dies ist der Grund, warum push funktioniert, da es nicht die Array-Referenz, sondern den Array-Inhalt ändert.

Es gibt einige Möglichkeiten, dies zu beheben. Ohne in die verschiedenen Optionen zu gehen, ist es am einfachsten, den $scope.foo in eine Funktion zu packen, die Factory.foo zurückgibt. Auf diese Weise erkennt Angular eine Referenzänderung in einem Digest-Zyklus und aktualisiert die Ansicht entsprechend.

%Vor%     
Simon Belanger 02.09.2013, 09:22
quelle
1

@ Simon-Belanger Antwort ist richtig und er präsentiert eine praktikable Lösung.

Eine andere Option wäre, das Array einfach zu leeren und neue Elemente hineinzuschieben (z. B. für ein Auffrischungs-Ereignis), statt die Referenz durch Zurücksetzen eines neuen Arrays zu löschen. Sie können ein Array abschneiden, indem Sie der Länge: myArray.length = 0 zuweisen, und dann können Sie über die neue Sammlung iterieren, um neue Einträge über array.push()

zu füllen     
AJ. 23.11.2014 21:49
quelle