Ich versuche, this SO answer explaining how to render a recursive JSON structure using a directive zu folgen. Im Gegensatz zu der angegebenen Antwort sind meine Daten jedoch nicht bekannt, wenn das DOM geladen wird und Angular zum ersten Mal ausgeführt wird.Aktualisierung der Angular JS-Anweisung, wenn sich der Dienst ändert
Stattdessen werden meine Daten aus einem HTML-Eingabefeld abgerufen und in einem Angular Service gespeichert (wenn der Benutzer das Formular abschickt).
Wie kann ich eine Winkelrichtlinie auf dem neuesten Stand halten, wenn die Daten des Dienstes geändert werden?
-Update in Reaktion
zu beantworten @musically_ut eine ausgezeichnete Antwort zur Verfügung gestellt, die dazu beigetragen hat, aber ein ähnliches Problem aufgedeckt und verhindert eine Implementierung (aktualisiert hier).
Die Direktive Rendern HTML, die Angular {{expressions}}
enthält, die auf Daten zugreifen, die in $scope
gespeichert sind. Da die ursprüngliche Lösung war $watch
, wenn die Service hatte es Daten bereit. Wie kann ich sicherstellen, dass die "neuen" Daten zu $scope
hinzugefügt werden, bevor die Direktive rendert?
Eine Übersicht über die Architektur und die Strömung ist:
ControllerA
-> Get Eingabe von BenutzerControllerA
-> Verwenden Sie Service zu DatentransformationControllerB
->$watch
für Änderungen in ServiceDirective
->$watch
für cha nges in ServiceControllerB
-> Daten hinzufügen$scope
Directive
-> Anzeigedaten transformiert (von Service) Direktiven
Das Problem zwischen den Schritten 5 und 6 ist. Die Direktive rendert {{expressions}}
, bevor ControllerB die Daten zu $scope
hinzugefügt hat. Auch wenn das funktioniert, fühlt es sich viel zu komplex und 'hacky' an.
In der Tat, ich verwende $watch
in ControllerB, um zu warten, wenn die transformierten Daten in einem Dienst bereit sind. Selbst das fühlt sich etwas übertrieben an (der Dienst führt keine asynchronen Anrufe durch).
ich in Winkel bin hier, und auf Ihre Post erhalten, indem Informationen der Suche über Dienste Änderungen in den Richtlinien zu beobachten. Soweit ich sie verstehe (und entsprechend dem, was ich kürzlich gelesen habe), sollten Sie keine Daten zum Scope in Ihrem ** ControllerB ** hinzufügen, Sie sollten es besser dem ** Service ** melden, und zwar wird automatisch an den Bereich ** controllerB ** gemeldet. By the way, Sie können ** Service ** Änderungen in Ihrer ** Richtlinie ** verfolgen (ich meine leicht als Tracking der "externen" ** ControllerB ** Bereich.) Aber vielleicht irre ich mich. –