Ich habe unter string:
%Vor%Jetzt erzeuge ich eine Abfragezeichenfolge in der obigen Zeichenfolge mit einer Bereichsvariablen, aber das Problem ist, wenn sich der Wert dieser Variablen ändert, dann wird der neue Wert in meiner URL nicht automatisch aktualisiert.
Sie können in der folgenden Demo sehen, dass ich 2 Button Update und Check habe. In update erzeuge ich einen Abfrage-String und bei der Überprüfung aktualisiere ich den Wert der Gültigkeitsbereich-Variable, aber das wird nicht in meiner URL reflektiert.
Ich verstehe nicht, warum das passiert.
Erwartete Ausgabe, wenn ich auf die Schaltfläche "check" klicke, ohne die Methode generateQueryParameters aufzurufen:
%Vor%
Update: Ich weiß, wann sich der Wert von $ scope.no ändert, also glaube ich nicht, dass ich Watcher brauche und ich möchte nicht generateParameters
erneut aufrufen. Warum ist eckig nicht? automatisch den Wert in meinem str
wie die Art und Weise, wie angulare Bindungen funktionieren, zu aktualisieren?
Beginnen wir mit dem Problem in Ihrem Code.
Sie generieren den Anforderungsstring über eine Funktion, die nur innerhalb der Funktion update
Sie ändern die Versionsnummer in der Funktion check
, aber ohne die Funktion erneut aufzurufen, um $scope.str
zu ändern. Der Wert von $scope.str
ist also immer noch derselbe.
Sie können dies leicht testen, indem Sie die folgenden Schritte in Ihrem Snippet ausführen:
Klicken Sie auf update (v0)
Klicken Sie auf (v0)
Aber dann klicken Sie erneut auf update und Sie werden sehen, dass es jetzt aktualisiert wird (v2)
In Schritt 2 ändern Sie also tatsächlich die Version, Sie erzeugen einfach nicht das zu verwendende str
.
Eine einfache Lösung für Ihren Code ist einfach, Ihren Code so anzuordnen, dass Sie die Funktion zum Zuweisen des neuen str
bei jeder Änderung Ihrer Version aufrufen können:
Andernfalls müssen Sie den Parameter no
version überwachen und den str
-Wert jedes Mal aktualisieren, wenn sich die Version ändert. Aber diese Lösung impliziert, dass Sie in jedem einzelnen Controller, in dem Sie die APIs aufrufen, einen Watcher haben und auch alle Parameter, die immer in den Controllern fest programmiert sind:
Selbst wenn diese Lösung funktioniert, ist es tatsächlich nervig. Die Logik zum Verwalten von Anrufen befindet sich in den Controllern, was eine sehr schlechte Übung ist (Sie sollten überlegen, einen zentralen Dienst dafür zu verwenden).
So viel besser, in AngularJS können Sie einen benutzerdefinierten Interzeptor verwenden und dort alle Aktionen verwalten, die in Bezug auf HTTP-Anfragen ausgeführt werden sollen. Sie können also als Parameter der HTTP-Anfrage die Version der API angeben, die Sie verwenden möchten.
Damit bleibt Ihr Code sauber. Wenn Sie außerdem in der Zukunft eine Anfrage ändern möchten, können Sie einfach diesen Anfrageparameter ändern.
Wenn Sie alle Anfragen ändern möchten, können Sie innerhalb des Interceptors einfach festlegen, dass alle Anfragen an version 1
durch version 2
ersetzt werden.
Hier ein Beispielcode zur Definition des Interceptors:
%Vor% Führen Sie dann einfach wie immer die HTTP-Anfragen durch $http
aus und fügen Sie die Version, die Sie in der Anfrage verwenden möchten, als Parameter hinzu:
Damit der Interceptor alle Ihre Anforderungen vor der Ausführung "ausspioniert", wird er die Version und die Abfragezeichenfolge korrekt erstellen, und alle Ihre Operationen werden darin verwaltet und zentralisiert.
Genau wie der letzte Tipp, wenn Sie Konstanten wie Versionsnummern definieren, verwenden Sie AngularJS constant
und injizieren sie dort, wo Sie sie brauchen. Hardcodierte Saiten sind keine gute Übung.
Ich hoffe, das macht Sinn
Sie können einfach eine Eigenschaft str
definieren, indem Sie die neue Steuerung als Syntax verwenden (erlaubt Ihnen, direkt an Controller-Eigenschaften und Methoden zu binden):
Dies bedeutet jedesmal wenn Sie auf den Wert von str
zugreifen, wird die URL-Zeichenfolge neu ausgewertet. Dies macht Ihren Code unabhängig von $scope
und $watch
und ist zukunftsorientierter.
Für das folgende Objekt (aus der Diskussion):
%Vor%Wir können diesen Ansatz erweitern - siehe Demo unten:
Sie müssen die Methode generateQueryParameters erneut in der Prüfmethode aufrufen.
%Vor%Versuchen Sie das, das Problem ist mit Javascript primitive Werte werden als Werte nicht Referenzen übergeben.
%Vor%Sie können
verwenden %Vor%, um eine Änderung an Ihrem Bereich in einer Funktion vorzunehmen. Es hilft Ihnen im Wesentlichen dabei, die Datenbindung in beiden Richtungen zu erzwingen und neue Änderungen in Ihrem Bereich zu erkennen. Wenn Sie die Datenbindung korrekt implementieren, müssen Sie diesen Befehl nicht unbedingt verwenden, aber es funktioniert wie ein schmutziger schneller Hack.
Tags und Links javascript angularjs angularjs-scope angularjs-bindings