2013-02-15 9 views
14

Hoffnung irgendwelche AngularJS Gurus mich mit this.Here helfen kann, meine AngularJS Code istEvent.preventDefault() nicht für routeChangeStart in AngularJS App arbeitet

$scope.$on('$routeChangeStart', function(event, next, current) { 
       if ($scope.myForm.$dirty) { 
        if(!confirm("Unsaved, do u want to continue?")) { 
         event.preventDefault(); 
        } 
       } 
      }); 

Es Browser zurück Klicktaste warnt, wenn Daten verschmutzt ist, aber abbrechen oder oK auf Klick vervollständigt es immer noch die Strecke change.Seems wie event.preventDefault() funktioniert nicht. Kann zeigt jemand, was

+0

Wahrscheinlich überprüfen: http: // Stackoverflow.com/questions/14900008/prevent-redirect-verhalten-in-angularjs-app –

+0

@Flek aber diese lösung wird nicht den benutzer für eine bestätigung stattdessen einfach nicht erlauben die browse back button zum arbeiten – iJade

+0

Ich bin in das gleiche Problem läuft. Ich habe sowohl $ routeChangeStart als auch $ locationChangeStart ausprobiert, aber keiner von ihnen hat funktioniert. Haben Sie eine geeignete Lösung für dieses Problem gefunden? – Sam

Antwort

3

Nach dem AngularJS falsch sein kann docs (bei $ Sendung sehen) Sie können einfach nicht ein Ereignis vom Typ Sendung abbrechen ($routeChangeStart dieser Art ist):

die Veranstaltung Lebenszyklus beginnt mit dem Rahmen, auf dem $ Sendung war genannt. Alle Zuhörer für Name Ereignis wartet auf diesen Bereich Benachrichtigung. Danach breitet sich das Ereignis an alle direkten und indirekten Bereiche des aktuellen Bereichs und fordert alle registrierten Listener entlang die Art und Weise. Das Ereignis kann nicht abgebrochen werden.

+0

ok, so ist dere jede andere Möglichkeit, Browser zu erkennen zurück Schaltfläche klicken Sie auf andere als verwenden $ routeChangeStart.Ich habe bereits locationChangeStart und onbeforeunload versucht, beide funktionieren nicht – iJade

+0

Ich würde zuerst eine Funktion aufrufen, die alle Abhängigkeiten überprüft und nur wenn sie wahr sind, ändern Sie den Speicherort. Ein bisschen mehr Details darüber, was Sie eigentlich tun möchten, wären gut. –

+0

Naja, eigentlich habe ich ein Formular. Wenn das Formular ungespeicherte Daten hat und der Benutzer auf den Browser-Button klickt, fragt er nach einer Bestätigungsnachricht. Das ist, was ich eigentlich versuche zu tun. Es wäre volle Hilfe, wenn du etwas Code posten kannst . – iJade

32

Ich hatte viel Mühe diese einen zu finden, aber anstelle der „$ routeChangeStart“ Ereignis, können Sie auf die „$ locationChangeStart“ Ereignis hören, für die Sie Standard verhindern können:

$scope.$on("$locationChangeStart", function(event, next, current) { 
    if (!confirm("You have unsaved changes, continue navigating to " + next + " ?")) { 
     event.preventDefault(); 
    } 
}); 

Sie können auch verhindern, dass immer standardmäßig speichern „next“ und eine saubere JS modal anzeigen und asynchron entscheiden.

$ locationChangeStart ist derzeit nicht dokumentiert, aber hier verwiesen: https://github.com/angular/angular.js/issues/2109

+0

Es funktioniert für mich! – RolandoCC

+0

Danke, danke, danke! –

2

Dieses Problem wurde in den neuesten Versionen behoben wurde (> = 1.3.8).

Da die Argumente zu $ ​​routeChangeStart geliefert detaillierter sind (und oft nützliche), wenn möglich, versuchen Sie, abgewinkelte Ausführung zu aktualisieren ...

5

genau behoben nach Angular 1.3.7 https://code.angularjs.org/1.3.7/docs/api/ngRoute/service/ $ route

$ routeChangeStart vor einer Routenänderung übertragen. An diesem Punkt beginnen die Routendienste damit, alle Abhängigkeiten aufzulösen, die für das Auftreten der Routenänderung erforderlich sind. In der Regel werden dabei sowohl die Ansichtsvorlage als auch Abhängigkeiten abgerufen, die in der Eigenschaft "Route auflösen" definiert sind. Sobald alle Abhängigkeiten aufgelöst sind, wird $ routeChangeSuccess ausgelöst.

Die Routenänderung (und die $ location change, die sie ausgelöst hat) kann durch Aufrufen der preventDefault-Methode des Ereignisses verhindert werden. Weitere Informationen zum Ereignisobjekt finden Sie in $ rootScope.Scope.

0

Das Problem kann fortbestehen, wenn Sie eine $stateProvider verwenden. In diesem Fall Gebrauch:

$scope.$on('$stateChangeStart', function(event){ 
 
    ..... 
 
    event.preventDefault(); 
 
});

Verwandte Themen