2017-08-07 5 views
0

Ich habe eine Angular App mit @uirouter. Ich möchte Zustände basierend auf Benutzern dynamisch laden, z. Wenn sich der Benutzer in einer bestimmten Gruppe befindet und auf einen bestimmten Menüeintrag klickt, der zu einer Funktion routet, möchte ich eine alternative Implementierung des Feature-Moduls laden.angular-ui-router Laufzeitstatus

Der Name des Staates ist derselbe, also habe ich versucht, uiRouter.stateRegistry.deregister und uiRouter.stateRegistry.register zu verwenden. Ich mache relevante Anrufe, wenn sich der Benutzer beim Übergang von der Anmeldung zur Anwendung anmeldet (da ich die Benutzeranmeldeinformationen kennen muss) - dafür benutze ich uiRouter.transitionService.onBefore. Also, Code ist grob:

uiRouter.transitionService.onBefore({}, transition => loginTransition(uiRouter, injector, transition)); 

    const isLogin = transition => transition.from().name === 'login' && transition.to().name === 'main'; 
    const isRefresh = transition => transition.from().url === '^'; 

    const loginTransition = (uiRouter: UIRouter, injector: Injector, transition: Transition) => { 
     if(isLogin(transition) || isRefresh(transition)) { 
     if(injector.get('authService').getUser() === 'specificUser') { 
      uiRouter.stateRegistry.deregister('feature-version-1'); 
      uiRouter.stateRegistry.register('feature-version-2'); 
     } 
     } 
    } 

Dies funktioniert gut beim Übergang in App und dann zum Feature navigieren. Es funktioniert auch mit der Seitenaktualisierung, wenn sich der Benutzer nicht auf der Funktionsseite befindet. Problem ist, dass es nicht funktioniert, wenn der Benutzer auf Feature-Seite aktualisiert - dann Feature-Version-1 lädt statt Feature-Version-2. Wenn Sie jedoch zu einer anderen Seite navigieren und zur Funktionsseite zurückkehren, wird Feature-Version-2 erneut geladen.

Dieses Verhalten lässt mich denken, dass, während (de) registrieren die Funktionalität von stateRegistry in einfachen Szenario innerhalb transitionService.onBefore funktioniert, in der Regel mit (de) Register ist nicht geeignet, hier verwendet werden? Oder vielleicht fehlt mir eine Art von State Refresh-Aufruf?

Kann jemand etwas Licht auf dieses werfen? Wann ist es am besten, die Funktionalität von stateRegistry (de) zu registrieren?

Antwort

0

Ich habe es herausgefunden, damit ich teile, falls jemand auf ein ähnliches Problem stößt. Trick besteht darin, stateRegistry innerhalb der Funktion aufzurufen, die an UIRouterModule.forChild() übergeben wird, das das Laden/Aktualisieren der Seite behandelt.

const register = (uiRouter: UIRouter, injector: Injector) => { 
    if(injector.get('authService').getUser() === 'specificUser') { 
     uiRouter.stateRegistry.deregister('feature-version-1'); 
     uiRouter.stateRegistry.register('feature-version-2'); 
    } 
} 

UIRouterModule.forChild({ 
    states: [/* states here */], 
    config: (uiRouter: UIRouter, injector: Injector, module: StatesModule) => { 
     register(uiRouter, injector); 
     uiRouter.transitionService.onBefore({from:'login', to:'main'}, transition => register(uiRouter, injector)); 
    } 
    })