2014-05-16 14 views
13

Kiedy wchodzę do mojej aplikacji pod numerem https://localhost/my-app/resources/index.html, mam logikę, aby przejść do mojego zdefiniowanego przez siebie stanu domyślnego. Jednak gdy chcę przejść bezpośrednio do określonej części mojej aplikacji (tj. https://localhost/my-app/resources/index.html#/orders/draft), stan nie jest ustawiany (ani szablon nie jest załadowany do dyrektywy ui-view). Po wykonaniu początkowego obciążenia (przy domyślnym ustawieniu stanu), mogę wykonywać bezpośrednie adresy URL do zawartości moich serc.Przy początkowym obciążeniu mojej aplikacji, dlaczego nie ustawiono stanu interfejsu użytkownika?

Chyba brakuje niektóre podstawowe pojęcia w jaki sposób rzeczy są ładowane w mojej aplikacji, ale chciałbym oczekiwać, że państwo dostanie ustawiony ponieważ URL jest zdefiniowana w $location.url()

fragment mojego kodu do obsługi stany przy początkowym obciążeniu:

$http.get("Navigation").then(function(response){ 
    var navigationObjects = response.data, 
     directUrl = $location.url(), 
     stateName = null; 

    scope.availableStates = ims360RouterStateService.getAvailableStates(navigationObjects); 
    if (!directUrl) 
    { 
     scope.updatePrimaryState(scope.availableStates[0]); 
    } 
    else 
    { 
     //TODO there's probably a better way to do this 
     //parsing out the state name, requires that the state name matches the url, this fails when I have a place holder (such as an id to a resource) 
     stateName = directUrl.substring(1).replace(/\//g, "."); 
     $state.go(stateName); 
    } 
}); 

W tym kodzie otrzymuję obiekty nawigacyjne z serwera, które określają, do którego routera użytkownika użytkownik ma dostęp. Wszystkie moje zdefiniowane stany są następnie filtrowane do dostępnych stanów, które są tym, czego używam w moim interfejsie nawigacyjnym.

Dodatkowo „updatePrimaryState (...) zawiera wezwanie do $ state.go (...)

Więc dlaczego nie jest ustawiony w stan początkowy obciążeniem? A jeśli jest to normalne zachowanie, to co jest dobrym sposobem, aby skierować użytkownika do adresu URL określonego?

UPDATE

stworzyłem plunker który pokazuje oczekiwane zachowanie (http://plnkr.co/edit/m9gQLOZmqaAY88wSc6wC?p=preview). próbowałem powielić mój problem, ale w prosty Sprawa działa po prostu zgodnie z oczekiwaniami, więc oczywiście jest coś na moim końcu, które jest nieodłączne t, ale mój układ jest bardzo podobny do tego w plunkerze. Aby przetestować ten scenariusz widzę w mojej aplikacji, którą trzeba:

  1. uruchomienia pogląd plunker w osobnym oknie
  2. Po sprawdzeniu, że stan jest ustawiony, skopiuj i wklej link w nowym oknie .
  3. W tym nowym oknie aplikacja powinna przejść bezpośrednio do stanu odpowiadającego adresowi URL. W plunkerze to działa, ale w mojej aplikacji tak się nie dzieje.

Po załadowaniu aplikacji stan załadowany jest pustym stanem o nazwie: "" z adresem URL "^".

UPDATE 2 Po wykopaniu w kodzie patrząc na różnicę, stwierdziliśmy, że gdy kanciasty „$ locationChangeSuccess” to broadcast, słuchacz w UI-routera nie jest jeszcze zainicjowany. Zauważam, że mamy oddzielną (wielokrotnego użytku) aplikację do logowania, która jest początkowo bootstrapowana, a następnie po udanym logowaniu uruchamia rzeczywistą aplikację. W momencie, gdy aktualna aplikacja jest bootstrapowana, $ locationChangeSuccess została już rozgłoszona, a odbiornik ui-router nie został jeszcze zainicjowany, aby go złapać.

Moją myślą było ponowne nagranie wydarzenia po bootstrapie mojej aplikacji, ale nadal mam problemy z timingiem, w których słuchacz zdarzeń jest pozornie ostatnią zainicjowaną. Najpierw dodałem go do bloku myApp.run(), ale transmisja była nadal wykonywana wcześniej. Włączenie transmisji do głównej funkcji aplikacji (tam, gdzie jest ui-view) działa, ale nie jest pewne, czy to dobre podejście. Czy istnieje lepszy sposób?

+0

można dodać do sekcji config gdzie późniejszej konfiguracji stanów? –

+0

możesz utworzyć prosty http://plnkr.co/, aby pokazać problem? –

+0

Stworzyłem plunkera, ale nie mogłem odtworzyć problemu w prostym przypadku. Moje komentarze są powyżej – Noremac

Odpowiedz

2

Pomyślałem, że lepiej iść do przodu i po mojej 2nd aktualizacji jako rozwiązanie, które było dla mojego przypadku:

Po wykopaniu w kodzie patrząc na różnicę, stwierdziliśmy, że gdy kanciasty „$ locationChangeSuccess "jest rozgłaszany, detektor w ui-routerze nie jest jeszcze zainicjowany. Zauważam, że mamy oddzielną (wielokrotnego użytku) aplikację do logowania, która jest początkowo bootstrapowana, a następnie po udanym logowaniu uruchamia rzeczywistą aplikację. W momencie, gdy aktualna aplikacja jest bootstrapowana, $ locationChangeSuccess została już rozgłoszona, a odbiornik ui-router nie został jeszcze zainicjowany, aby go złapać.

Włączenie emisji do głównej funkcji w aplikacji (tam, gdzie jest ui-view) działa, ale nie jest pewne, czy to dobre podejście.

Nadzieję, że pomaga.

Powiązane problemy