Настроить Route Guard - PullRequest
       24

Настроить Route Guard

0 голосов
/ 29 августа 2018

У меня есть охранник маршрута, который необходимо настроить. На каком-то маршруте мы хотим проверить, готов ли наш user client, на некоторых других мы хотим проверить, готов ли наш team client и т. Д.

У меня есть мой охранник маршрута, который выглядит так

@Injectable({
    providedIn: 'root'
})
export class ClientReadyGuard implements CanActivate, CanActivateChild {
    constructor(
        private clientName: string,
        private router: Router ,        
        private apolloState: ApolloStateService,

    ) {
        debugger;
    }

    canActivate(...) {
       // do things with clientName
    }

и от этого охранника я бы хотел иметь несколько охранников: один, который защищает с помощью clientName «все пользователи», один с «пользователем», один с «командой» и так далее.

Иметь:

canActivate: [
   AllUserClientReadyGuard,
   UserClientReadyGuard,
   TeamClientReadyGuard,

]

Для этого я безуспешно пытался с токеном инъекции; (NullInjectorError: No provider for InjectionToken router token!).

export const ROUTER_TOKEN = new InjectionToken<Router>('router token');
export const APOLLO_STATE_TOKEN = new InjectionToken<ApolloStateService>('apollo state token');


export const UserClientReadyGuard = new InjectionToken<ClientReadyGuard>(
    'user client ready guard',
    {
        providedIn: 'root', factory: () => new ClientReadyGuard(
            USER_CLIENT,
            inject(ROUTER_TOKEN),
            inject(APOLLO_STATE_TOKEN),
        )
    }
);

1 Ответ

0 голосов
/ 29 августа 2018

Я закончил, используя наследство. Хотя использование {data} от маршрутизатора, возможно, является лучшим вариантом в целом. Но так как мне понадобилось другое поведение для расширения охраны, я могу переопределять методы. Я предполагаю, что это зависит от регистра.

export abstract class ClientReadyGuard implements CanActivate, CanActivateChild {

    constructor(
        protected router: Router,
        protected apolloState: ApolloStateService,
        protected client: string
    ) { }

    canActivate(route: ActivatedRouteSnapshot): boolean | Observable<boolean> | Promise<boolean> {
        return this.checkReady(this.client);
    }


    protected checkReady(client: string): Observable<boolean> {
        //...
    }    
}

@Injectable({
    providedIn: 'root'
})
export class GlobalDataClientReadyGuard extends ClientReadyGuard {
    constructor(
        protected router: Router,
        protected apolloState: ApolloStateService,
    ) {
        super(router, apolloState, GLOBAL_DATA_CLIENT);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...