Warum wird mein Beobachter zweimal bei der gleichen Änderung gerufen?

8

Ich habe eine AngularJS 1.4 * Anwendung, die lokal (noch) läuft. Diese App wird von einer Laravel 5.1 Backend RESTFul API bedient.

Ich muss diese App machen, die eine Pauschalreise darstellt. Ein Paket besteht aus Tagen von 0 bis zu N Tagen. Jeder Tag hat eine Liste von Dienstleistungen, die von 0 bis N Dienstleistungen reichen. Und ein Hotel.

Mein Webserver, von dem meine Laravel-Anwendung Gebrauch macht, liefert mir ein vorkonfiguriertes Paket mit einer Liste von Tagen: jedes mit einer Liste von Diensten und Hoteldaten (bisher ungenutzt). Auf der Antwort habe ich eine Liste von Eigenschaften für das Paket (die für jetzt nicht wichtig sind) und ein Array von Tagen, genannt days_info . Diese Antwort wird in $scope.package , in meinem PackageController geschrieben. Der PackageController deklariert auch eine Anweisung namens packageBlock , die aus einer Liste von Tagen und einigen anderen Daten für das Paket besteht.

%Vor%

Innerhalb von <package-days-block> directive, muss ich jeden Tag die Liste der Dienste durchsehen.

%Vor%

Hier beginnt das Problem: zu meiner Enthaltung habe ich jetzt ein $scope.service in meinem ServiceController . Also, ich habe begonnen, es an meinem Bedarf innerhalb der ServiceController durch eine $scope.service zu ändern.

Der $ scope.service hat ein Attribut namens service_id . Ich setze einen Listener / Watcher darauf, so dass zu jeder Zeit die $ scope.service.service_id geändert wird, ich frage nach einem anderen service_table (enthält die Informationen über die Dienste, sie basiert auf der service_id zuvor vom Benutzer ausgewählt oder geändert) und in $scope.service.table eingefügt.

%Vor%

Der reloadServicesTable wird im Watcher für die Änderungen service_id aufgerufen.

%Vor%

Das Problem beginnt hier: Die Anfrage für die Service-Tabelle wird zweimal aufgerufen, wenn sich service_id nur einmal ändert.

WARUM, GOTT, WARUM?!

Es gibt einen anderen Teil meines Codes, wo ich von der PackageController , durch die gesamte days_info Array ausgeführt und liest den Wert eines Attributs price innerhalb des service.table: service.table.price . Dort erkenne ich, dass es zwei Scope gibt: den einen, den ich betreue, und den anderen, bei dem ich keine FREAKING IDEE habe, woher er kommt!

Wenn ich console.log($scope); in die Methode lege, die durch days_info läuft, erhalte ich zwei Bereiche für jede Anfrage. Diese Methode befindet sich auf dem PackageController .

Irgendwelche Ideen, warum das passiert?

P.S .: Es ist meine allererste AngularJS-Anwendung, also, nehmen Sie es leicht, wenn ich etwas Grundlegendes vermasselt habe ...

BEARBEITEN:

Wie ein Kollege auf die Kommentare hingewiesen hat, war meine Frage nicht sehr reproduzierbar. Leider kann ich hier nicht nur die Frage stellen, die ich bezweifle, weil ich nicht die geringste Ahnung habe, wo das Problem liegt! (Ich weiß, dass das nicht viel hilft)

Ich habe einige Screenshots von der Chrome-Konsole gemacht:

Zuerst wurden die Anfragen auf die Änderung der service_id ausgelöst

Wie Sie sehen, wird jede Anfrage jedes Mal zweimal aufgerufen. Das ist keine einmalige Sache. Der /api/service/{id}... ist der Aufruf für die Tabelleninformation des Dienstes. Das /api/service/by_route/origin/... gibt eine Liste von Diensten von einer Stadt zu einer anderen (oder dem gleichen) zurück. Man stört sich nicht auf der anderen.

Das andere Bild ist die Ausgabe von console.log aus dem Gültigkeitsbereich von PackageController $ zu der Zeit, zu der die service_id geändert wird.

Wie Sie sehen können, gibt es zwei verschiedene Bereiche. Und das b Umfang ist Sohn des r Umfangs. Der r -Bereich ruft auch den Watcher auf service_id ?

auf

Der Aufruf für die Summen Preis wurde zweimal von differente Orten genannt, wie Sie im Bild unten sehen können:

    
Dennis Braga 25.02.2016, 23:17
quelle

2 Antworten

3

Es könnte Ihr Problem lösen. Sogar ich hatte genau das gleiche erlebt, wie du erwähnt hast.

  1. Der Grund für mich war, dass der Controller wieder initialisiert wurde und ein separater API-Aufruf darin geschrieben war, der ursprünglich die Seite laden sollte.

  2. Es kann auch ein Szenario geben, in dem Sie den Controller zweimal in der Markierung zugewiesen haben.

Luke P. Issac 07.03.2016, 11:13
quelle
1
%Vor%

Übergeben Sie day und service down in Direktiven. Verwenden Sie die Zwei-Wege-Bindung, um die Änderungen day und service an package.days_info zu übergeben.

Entfernen Sie ServiceController Es macht keinen Sinn, einen Controller zu wiederholen. <service-block> und <package-days-block> sind E-Anweisungen, die Logik verarbeiten.

Schreiben Sie nur einen Watcher in Ihren PackageController , der package.days_info anzeigt. Wenn sich Ihre day oder service ändern, kann sie einfach etwas herausfinden und etwas dagegen tun.

Just Chill und reparieren Sie es.

    
robert 07.03.2016 03:03
quelle