Die Änderung des Wertes der Bereichsvariablen wird nicht in meiner Zeichenkette angezeigt

8

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%

%Vor% %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?

    
Learning-Overthinker-Confused 05.09.2017, 12:39
quelle

7 Antworten

3

Beginnen wir mit dem Problem in Ihrem Code. Sie generieren den Anforderungsstring über eine Funktion, die nur innerhalb der Funktion update

aufgerufen wird %Vor%

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:

  1. Klicken Sie auf update (v0)

  2. Klicken Sie auf (v0)

  3. 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:

%Vor%

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:

%Vor%

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:

%Vor%

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

    
quirimmo 05.09.2017 13:28
quelle
1

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):

%Vor%

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.

%Vor% %Vor%

Für das folgende Objekt (aus der Diskussion):

%Vor%

Wir können diesen Ansatz erweitern - siehe Demo unten:

%Vor% %Vor% %Vor%
    
kukkuz 21.09.2017 02:42
quelle
0

Sie müssen für no einen Watcher hinzufügen, der Ihre Methode namens generateQueryParameters aufruft und den Wert von $scope.str

ändert

%Vor% %Vor%

Erst update und dann check

    
C2486 05.09.2017 12:45
quelle
0

Sie müssen die Methode generateQueryParameters erneut in der Prüfmethode aufrufen.

%Vor%     
Manoj Yadav 05.09.2017 12:50
quelle
0

Versuchen Sie das, das Problem ist mit Javascript primitive Werte werden als Werte nicht Referenzen übergeben.

%Vor%     
suryapratap 23.09.2017 14:46
quelle
0

Versuchen Sie Folgendes:

%Vor%     
ManojMeria 24.09.2017 07:35
quelle
0

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.

    
Rohan Kanjani 22.09.2017 19:26
quelle