2014-08-27 14 views
8

używam nowego deferIntercept() z UI-routera, aby zaktualizować URL przeglądarki bez przeładowywania mój kontroler:ui-Router deferIntercept i stan params

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

Z tym kodem, kliknięcie przycisku Wstecz przeglądarki zmienia adres URL na poprzedni, ale nie mogę zaktualizować stanu kontrolera, aby odzwierciedlić tę zmianę. $ stateParams nadal zawiera wartości ustawione, gdy użytkownik po raz pierwszy załadował stronę.

Jaki jest najlepszy sposób na zaktualizowanie obiektów $ state i $ stateParams w moim kontrolerze, gdy użytkownik kliknie przycisk Wstecz lub ręcznie zmieni adres URL?

dziękuję!

Odpowiedz

7

Twoje połączenie z numerem $urlRouter.listen() powinno zostać umieszczone poza obsługą zdarzeń. Fragment kodu należy warunkiem zostać zmienione na:

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

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

Źródło:official documentation for $urlRouter zawiera przykładowy kod dla metody deferIntercept. Kładzie wezwanie do $urlRouter.listen() zewnątrz funkcję detektora:

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

Opcja '$ state' parametr nie pozostaje zaktualizowane jednak – Shamoon

+0

jestem znalezieniem kiedy uruchomić' if (UserService.isLoggedIn()) return; 'nie robi faktycznie synchronizuję trasę, chyba że konkretnie zadzwonię do synchronizacji – Maruf