2015-09-16 14 views
6

Pracuję nad projektem kanciastym, w którym ustawiłem moje stany, jak pokazano poniżej.angularjs ui-router stateparams niewidoczne przegrane na odświeżenie strony

$stateProvider.state('UserPanel', { 
    url: '/user', 
    params: { userId: null }, 
    views: { 
     '[email protected]': { 
      templateUrl: '/AngViews/UserPanel/UserPanel.UserDetails.html' 
     } 
    } 
}); 

kiedy przejść do widoku, trwa params z nim, więc ta część działa.

Ale po aktualizacji strony traci ona parametry. Wiem, że jeśli zdefiniowałem parametry w zmiennej url, to zadziała. ale chcę uczynić to niewidzialnym.

Znalazłem coś w rodzaju this, ale nie wiem, czy to rozwiąże mój problem. nie może działać tak, jak działa. kto może wyjaśnić, jak można to zrobić?

Dzięki za poświęcony czas

+2

Po odświeżeniu aplikacji w rzeczywistości pełna aplikacja zostanie uruchomiona ponownie. Dlatego żadne wcześniejsze dane nie będą przechowywane w aplikacji. Jedyną częścią, która nie zostanie odświeżona, jest adres URL. Więc jeśli umieścisz stateparam w adresie URL, zadziała to inaczej, musisz użyć localstorage lub czegoś podobnego do przechowywania danych. – Indra

+0

Widzę. ale czy jest możliwe zapisanie go w lokalnej pamięci lub buforowanie go tylko na jednej stronie, a następnie usunięcie go, gdy zmienia stan? – DaCh

+0

Tak, to możliwe. Dla każdej trasy istnieje określona funkcja rozstrzygania. Tak więc na konkretnej trasie możesz ustawić dane w pamięci lokalnej, a w innym musisz usunąć localstorage. – Indra

Odpowiedz

4

I w obliczu tego samego problemu i rozwiązać go z tym kodem

angular.module('app').run(function($rootScope, $state, localStorageService) { 

    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { 
    var prefix = "stateParams."; 
    var fromStateName = prefix + fromState.name; 
    var toStateName = prefix + toState.name; 
    var f = true; 
    for (var k in toState.params) { 
    f = f && (JSON.stringify(toParams[k]) == JSON.stringify(toState.params[k])); 
    } 
    if (f && localStorageService.get(toStateName) != null) { 
    event.preventDefault(); 
    var savedToParams = localStorageService.get(toStateName); //retrieving toParams from local storage 
    localStorageService.remove(toStateName); 
    for (var k in toState.params) { 
     toParams[k] = savedToParams[k]; //update only the params {} not url params 
    } 
    $state.transitionTo(toState,toParams); 
    } else { 
    var toSave = {}; 
    for (var k in toState.params) { 
     toSave[k] = toParams[k]; //save only the params {} not url params 
    } 
    localStorageService.set(toStateName,toSave); 
    } 
    }); 

}); 

Gist

Staram się używać localStorageService do 'cache' params między przejściami państwowych .

kiedy przechodząc od stanu A do stanu B, usunąć wcześniej zapisane params dla A.

Następnie należy sprawdzić, czy params, które są wysyłane do B pasuje params w definicji stanu B, i jeśli się zgadzają, ładuję parametry z localStorage, ponieważ oznacza to, że użytkownik przeszedł odświeżenie i parametry zostały zresetowane.

Przetestowałem ten kod w kilku przypadkach, ale nadal nie został on w pełni przetestowany.

+0

Cholera, czy lokalne Czy to jedyna możliwość? To lub przekazywanie parametrów w adresach URL? Czy jest jakiś inny sposób? – AlxVallejo

+0

Tłuszcz, o ile wiem, nie jest, Twoja aplikacja zostanie w pełni zrestartowana, gdy użytkownik odświeży się, więc stracisz swój zakres i dane fabryczne/serwisowe, a jedynym sposobem, jaki znam, aby zachować te dane, jest plik localStorage. –

+0

W tym artykule omówiono użycie $ cookieStore dla stanu odświeżenia. http://maffrigby.com/maintaining-session-info-in-angularjs-when-you-refresh-the-page/ – HungryArthur