UI-Router - Bereich nicht zerstört Zustand zu ändern?
Ich bin ein neuer Benutzer, AngularJS und ui-router, und ich bin versucht zu drehen, mein Kopf herum wie der Umfang verwaltet wird. Ich hatte erwartet, des Geltungsbereichs einer active-controller zerstört werden würde, wenn es inaktiv wird, auf Zustand zu ändern, jedoch, es scheint nicht der Fall zu sein.
Habe ich geändert am Beispiel von UI-Router ist die Webseite um die situation zu illustrieren (siehe plunker unten). Jedes mal, wenn der Staat route1.Liste/route2.Liste ausgelöst wird, die Sie emittieren, ein Ereignis auf den $rootScope. Nach Erhalt den Fall, eine debug-Anweisung wird gedruckt auf Konsole.
Durch Umschalten zwischen den beiden Staaten ein paar mal, es wird beobachtet, dass der Controller initialisiert zuvor reagierte der Veranstaltung. So erscheint es, dass die Bereiche, die von Ihnen erstellt wurden, wurden nie zerstört. Ist dieses Verhalten zu erwarten? Wenn ja, was soll ich tun, so dass nur aktive Controller wird auf ein Ereignis reagiert?
Debug-Meldung gedruckt, die auf der Konsole:
Code:
var myapp = angular.module('myapp', ["ui.router"])
myapp.config(function($stateProvider, $urlRouterProvider){
//For any unmatched url, send to /route1
$urlRouterProvider.otherwise("/route1")
hier ist die route1
$stateProvider
.state('route1', {
url: "/route1",
templateUrl: "route1.html"
})
.state('route1.list', {
url: "/list",
templateUrl: "route1.list.html",
controller: function($rootScope, $scope){
$rootScope.$emit("eventCT1");
$rootScope.$on("eventCT2", fn);
function fn () {
console.log("Controller 1 receives an event emitted by Controller 2");
}
$scope.items = ["A", "List", "Of", "Items"];
}
})
und hier ist die route 2
.state('route2', {
url: "/route2",
templateUrl: "route2.html"
})
.state('route2.list', {
url: "/list",
templateUrl: "route2.list.html",
controller: function($rootScope, $scope){
$rootScope.$emit("eventCT2");
$rootScope.$on("eventCT1", fn);
function fn () {
console.log("Controller 2 receives an event emitted by Controller 1");
}
$scope.things = ["A", "Set", "Of", "Things"];
}
})
...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn wir wollen, etwas zu tun mit
1)
$rootScope
im inneren des Controllers (die hat eine sehr begrenzte Lebensdauer),2) müssen wir zerstören, die, wenn controller (seine
$scope
in der Tat) zerstört wirdSo, das ist die Art und Weise, wie Haken und Haken
Aber im obigen Fall, sollten wir nicht sogar versuchen,
1) erstellen Sie einige controller-Aktion für ein Staat...
2) und erwarten, dass es aufgerufen wird, in einem anderen controller von verschiedenen staatlichen
Diese werden nie zusammen Leben
$rootScope
ohne Registrierung auf controller-Ebene. Hoffe, es hilft ein bisschen. Genießen UI-Router und eckig und Sie können evne akzeptieren, wenn die Antwort, die Ihnen geholfen...Wenn Sie mit Ionischen winklig, könnten Sie die life-cycle-events etwa so:
Könnten Sie spielen, um mit den anderen Veranstaltungen in den oben genannten link als gut. Und es ist wahrscheinlich die beste Praxis zur Minimierung der Verwendung von
$emit
, das führt zu mehr vorhersehbar code und weniger Staat Mutationen.