wake-up-neo.net

Angularjs $ übertrug einmal, $ zweimal

Es sendet einmalig $ broadcast vom rootScope, der Listener ($ on) wird jedoch zweimal aufgerufen.

Der Listener befindet sich in einem Controller und verwendet $rootScope.$on anstelle von $scope.$on. Hat jemand dieses Problem gehabt?

bearbeiten

rootScope:

$rootScope.$broadcast('menuActivateAction' + item.event_name_postfix, item.event_args);

anderer Controller:

$rootScope.$on('menuActivateActionPublish', function(event) {});
18
Shai M.

Da Sie Ihren $ on Listener auf $ rootScope registrieren, wird er nicht mit dem Controller zerstört. Wenn Sie den Controller das nächste Mal starten, wird er erneut erstellt. 

Sie sollten Ihren Listener im Controller-Bereich erstellen

$scope.$on('menuActivateActionPublish', function(event) {});
21
Tom

Seien Sie vorsichtig, Sie vermeiden zwei Instanzen des Controllers, dh zwei Ereignis-Listener. Das bedeutet, dass die Methode zweimal ausgeführt wird. (Beispiel: zweimal 'ng-controller' verwenden)

7
que1326

Um die Antwort von que1326 zu ergänzen, zum Beispiel, wenn Sie einen ui-router verwenden und so etwas haben

.state('app.yourpage', {
            url:'yourPage',
            views: {
                '[email protected]': {
                    templateUrl : 'views/yourPage.html',
                    controller  : 'YourController'
                }
            }
        })

und in yourPage.html haben Sie einen ng-controller="YourController as Ctrl", dann erstellen Sie zwei Instanzen des Controllers: Eine Instanz wird durch die Statuskonfiguration und eine weitere in Ihrer HTML-Datei erstellt.

4
João Otero

Die einzige Lösung, mit der ich arbeiten konnte, bestand darin, den Listener innerhalb des $ viewContentLoaded-Ereignisses zu erstellen:

$scope.$on('$viewContentLoaded', function() {
  //Put your listener(s) in here
  $scope.$on('menuActivateActionPublish', function(event) {});
});
0
CommandoScorch