2016-08-18 6 views
0

Ich benutze Angular 1.5 und UI-Router. Ich möchte erkennen, wenn ein Benutzer eine Route leaves. Ich habe zur Zeit so etwas wie bekam:Angular detect beim Verlassen einer Route.

$scope.$on("$stateChangeSuccess", function() { 
     if (!$scope.flag) { 
     //... 
     $scope.do_work(reason); 
     } 
    }); 

dies funktioniert nicht ganz, weil, wenn der Benutzer auf die dieser Route navigiert, $scope.flag-false eingestellt ist und diese Funktion nicht richtig ausgelöst. Gibt es eine idiomatische Möglichkeit, eine Funktion auszulösen, wenn ein Benutzer von einer bestimmten Route weg navigiert, aber nicht, wenn er dorthin navigiert?

+0

Wenn es ** zu ** es navigiert, kommt es von einer anderen Route (die weg navigiert). So wird es immer gefeuert –

Antwort

2

Ich würde sagen, verwenden Sie onExit Hook von ui-router, die Sie im Einzelzustand angeben können. Aber Sie können nicht innerhalb $scope zugreifen.

Um damit umzugehen, würde ich sagen, Wartung zu halten, die gemeinsame Daten haben wird. Ändern Sie diese gemeinsam nutzbaren Daten von onExit Hook Ihres gewünschten Staates. Dann können Sie auch auf den gleichen Dienst in Ihrem Controller zugreifen.

$stateProvider.state("contacts", { 
    template: '<h1>Dummy Template</h1>', 
    controller: 'myCotroller', 
    onExit: function(sharableService){ 
    //... do something sharableService variable... 
    } 
}) 
+0

das klingt wie die beste verfügbare Lösung, aber ich bin mir nicht sicher, ich möchte einen Dienst erstellen, der nur den Status einer Variablen enthält. Ich konnte es umgehen, indem ich rootScope anstelle von scope benutzte, was keine gute Lösung ist. –

+1

Gehen Sie nicht für rootScope, erstellen Sie nur service.relather sagen es als einen allgemeinen Namen wie 'sharedDataService' und haben Sie Variable, möglicherweise in Zukunft könnten Sie mehr Variablen Daten und Methoden dort haben .. –

+0

Ich endete mit' $ scope. $ destroy'. Ich habe versucht, einen Dienst mit $ stateProvider in der Konfigurationsfunktion von eckig zu injizieren, aber das würde nicht funktionieren. –

Verwandte Themen