Ist es richtig, den "Strom" $scope
an einen AngularJS-Dienst weiterzuleiten ?
Ich bin in der Situation, dass ich einen $ -Dienst habe, der weiß, dass er nur von einem Controller verwendet wird, und ich möchte einen Verweis auf den Umfang des Controllers in den $ service-Methoden selbst haben.
Ist das philosophisch korrekt?
Oder sollte ich Ereignisse besser an $ rootScope senden und dann von meinem Controller abhören lassen?
$scope
Eigenschaften zugreifen und$scope.$apply
bei Bedarf anrufen können.$scope
. Wie würde der Controller direkt auf die Daten im Dienst zugreifen und sie an die Ansicht übergeben, ohne dies zu tun?Antworten:
Verwenden Sie Angular-Versprechen, um den Controller zu informieren, wenn etwas Asynchrones passiert .
Um das zu provozieren
$apply
, benötigen Sie den Bereich nicht, den Sie aufrufen können$rootScope.$apply
, da es keinen Unterschied gibt, ihn in einem bestimmten Bereich oder im Stammverzeichnis aufzurufen.In Bezug auf das Lesen der Variablen ist es besser, wenn Sie Parameter erhalten. Sie könnten es aber auch aus einem Bereich als Objektparameter lesen, aber ich würde mich für einen Parameter entscheiden, der Ihre Serviceschnittstelle viel klarer macht.
quelle
$scope
über einen Aufruf eines Dienstes mithilfe einer asynchronenexecuteSql()
Funktion hinzufügen . Wenn Sie sich 3 Optionen ansehen (1), verwenden Sie einen Rückruf für die Async-Funktion und rufen Sie dann auf$scope.$apply
... dies funktioniert, ist aber hässlich. (2)$scope
Übergeben Sie die Funktion für die Async-Funktion. Rufen Sie dann auf.theScope.$apply()
Dies funktioniert auch. (3) Verwenden Sie ein Versprechen. .. noch nicht versucht. Warum ist ein Versprechen der beste Weg? Vielen Dank!Ich würde sagen, wenn Ihre Funktionalität nur für einen Controller spezifisch ist, benötigen Sie keinen Dienst.
Die Aufgabe des Controllers besteht darin, das spezifische Modell zu manipulieren, während ein Dienst globale Aufgaben behandeln sollte. Ich würde mich lieber an dieses Paradigma halten, anstatt die Dinge durcheinander zu bringen.
Das sagen die Dokumente
Bedienung
Regler
PS: Abgesehen davon können Sie, wenn Sie verdauen müssen, auch das $ rootScope in Ihren Dienst injizieren.
quelle
$apply
oder$digest
das $ rootScope für mich völlig sinnvoll.Ja. Sie können den Bereich $ an den Service übergeben, wenn Sie ihn initialisieren. Im Servicekonstruktor können Sie den Bereich so etwas zuweisen._scope und dann auf den Bereich innerhalb des Service verweisen!
quelle
$scope
wenn dieser Controller den Service injiziert, um keine Methode für den Service aufrufen und manuell$scope
an ihn übergeben zu müssen.new MyFunction()
). Die Frage betraf einen Dienst, bei dem ein Anrufnew
nicht möglich ist.Ich persönlich halte die Weitergabe
$scope
an einen Dienst für eine schlechte Idee , da dadurch ein Zirkelverweis entsteht: Der Controller hängt vom Service ab, und der Service hängt vom Umfang des Controllers ab.Abgesehen davon, dass sie in Bezug auf die Beziehungen verwirrend sind, stehen solche Dinge dem Müllsammler im Weg.
Mein bevorzugter Ansatz besteht darin, ein Domänenobjekt in den Controller-Bereich zu stellen und dieses an den Dienst zu übergeben. Auf diese Weise funktioniert der Dienst unabhängig davon, ob er in Zukunft in einem Controller oder in einem anderen Dienst verwendet wird.
Wenn der Dienst beispielsweise Elemente aus einem Array pushen und entfernen soll, lautet
errors
mein Code:Der Dienst interagiert dann mit der Steuerung, indem er weiterarbeitet
errors
. Natürlich muss ich vorsichtig sein, niemals die gesamte Array-Referenz auszulöschen, aber am Ende des Tages ist das ein allgemeines JS-Problem.Ich würde niemals Rundfunk
$apply
und / oder ähnliche Dinge verwenden wollen, weil imho gute OO-Praktiken immer die Angular-Magie übertreffen werden.quelle
$scope.errors = []; $scope.myService = new MyService($scope.errors);
errors
lebt unabhängig von$scope
. Das ist der springende Punkt dieser Antwort. Bitte überprüfen Sie den Link, den ich im Text angegeben habe. Prost.$scope.errors
zeigt er aufvar errors
und die variablen Fehler erscheinen mir überflüssig, da es sich nur um einen weiteren Zeiger handelt. Eine ähnliche Situation, die ich mir vorstellen kann und die offensichtlich überflüssig ist, ist dieser Code :const errors = errors2 = errors3 = []; $scope.errors = errors;
. Stimmen Sie zu, dass nur der von Ihnen bereitgestellte Codevar errors = []
überflüssig erscheint?errors
lebt unabhängig von$scope
. Sie müssen verstehen, was ein Domänenobjekt ist und was einevar
Zuweisung ist. Wenn der von mir bereitgestellte Link nicht ausreicht, steht ausreichend anderes Material zur Verfügung.MyService(errors)
. Nach meinem Verständnis sollte der Dienst ein Protokollierungsarray basierend auf dem Parameter (in diesem Fall einem Zeiger) generieren. Für mich ist das ein schlechtes Muster, da die Dienste Singletons im Winkel sind. Wenn die Implementierung des Dienstes gut programmiert ist, sollte das Array in einer internen Variablen generiert werden (um weiterhin ein Singleton zu sein). Daher ist es nicht sinnvoll, die Variable außerhalb des Dienstes zu initialisieren.