2014-08-27 10 views
8

ich die neue deferIntercept() verwenden, von ui-Router ohne den Browser-URL zu aktualisieren mein Controller neu zu laden:ui-Router deferIntercept und Zustand params

$rootScope.$on('$locationChangeSuccess', function(e, newUrl, oldUrl) { 
    e.preventDefault(); 
    if ($state.current.name !== 'search') { 
    $urlRouter.sync(); 
    } 
    $urlRouter.listen(); 
}); 

Mit diesem Code, ein Klick auf den Zurück-Button des Browsers ändert die URL zu der vorherigen, aber ich kann meinen Controller-Status nicht aktualisieren, um diese Änderung zu spiegeln. $ stateParams enthält weiterhin die Werte, die beim ersten Laden der Seite durch den Benutzer festgelegt wurden.

Was ist der beste Weg, um die Objekte $ state und $ stateParams in meinem Controller zu aktualisieren, wenn der Benutzer auf die Schaltfläche Zurück klickt oder die URL manuell ändert?

danke!

Antwort

7

Ihr Anruf an $urlRouter.listen() sollte außerhalb des Event-Handlers platziert werden. Die Code-Snippet zur Verfügung gestellt Sie soll geändert werden:

$rootScope.$on('$locationChangeSuccess', function(e, newUrl, oldUrl) { 
    e.preventDefault(); 
    if ($state.current.name !== 'search') { 
    $urlRouter.sync(); 
    } 
}); 

// Moved out of listener function 
$urlRouter.listen(); 

Quelle: Die official documentation for $urlRouter enthält ein Codebeispiel für die deferIntercept Methode. Sie stellt den Anruf an $urlRouter.listen() außerhalb des Zuhörers Funktion:

var app = angular.module('app', ['ui.router.router']); 

app.config(function ($urlRouterProvider) { 

    // Prevent $urlRouter from automatically intercepting URL changes; 
    // this allows you to configure custom behavior in between 
    // location changes and route synchronization: 
    $urlRouterProvider.deferIntercept(); 

}).run(function ($rootScope, $urlRouter, UserService) { 

    $rootScope.$on('$locationChangeSuccess', function(e) { 
    // UserService is an example service for managing user state 
    if (UserService.isLoggedIn()) return; 

    // Prevent $urlRouter's default handler from firing 
    e.preventDefault(); 

    UserService.handleLogin().then(function() { 
     // Once the user has logged in, sync the current URL 
     // to the router: 
     $urlRouter.sync(); 
    }); 
    }); 

    // Configures $urlRouter's listener *after* your custom listener 
    $urlRouter.listen(); 
}); 
+0

Der '$ state' Parameter jedoch nicht – Shamoon

+0

aktualisiert bleibt Ich finde, wenn ich' ausgeführt werden, wenn (UserService.isLoggedIn()) return; 'es doesn Ich synchronisiere die Route nicht, es sei denn, ich rufe ausdrücklich sync auf – Maruf

Verwandte Themen