J'essaie de charger la page d'accueil de mon application pour les visiteurs qui ne sont pas authentifiés.
const routes: Routes = [
{ path: '', loadChildren: './home/home.module#HomeModule' }
...
Les utilisateurs authentifiés doivent obtenir leur flux via ce module, également sur le chemin vide.
{ path: '', loadChildren: './feed/feed.module#FeedModule', canActivate: [IsAuthenticationGuard] },
{ path: '', loadChildren: './home/home.module#HomeModule', canActivate: [NoAuthenticationGuard] },
Je m'attendrais à ce que IsAuthenticationGuard
échoue et charge le composant d'origine par défaut.
A la place, il télécharge le paquet de module de flux (indiqué dans l'onglet réseau) mais ne charge rien dans la prise du routeur. Très perturbant.
Comment puis-je faire un routage conditionnel (basé sur des gardes ou autrement) sur le chemin vide?
Mise à jour: Voici les gardes sur demande
@Injectable()
export class IsAuthenticationGuard implements CanActivate {
constructor(
private authenticationService: AuthenticationService
) { }
public canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> {
return this.authenticationService.isAuthenticated.pipe(take(1), map((isAuthentication) => {
return isAuthentication;
}));
}
}
J'ai fait des recherches sur la nouvelle urlTree
et c'est cool que vous puissiez maintenant rediriger via la route plutôt que dans la garde. Cependant, les redirections ne semblent pas applicables si vous essayez d'utiliser le même itinéraire avec un module différent. Plz corrigez-moi s'il y a un moyen.
À mon avis, il y a quelques choses que vous faites mal.
Observable<boolean>
, vous n'avez pas besoin de mapper sa valeur.Consultez le guide de routage angulaire officiel ici . Il y a beaucoup d'informations utiles qui vous aideront. Surtout ceux-ci:
EDIT 2018/12/27
Donc, si la question est de savoir comment charger conditionnellement deux modules de fonctions sur le même chemin,
la réponse est, selon mon expérience, vous ne pouvez pas.
Je crois que ce que vous avez l'intention de réaliser n'est pas possible grâce aux gardes. Angular recherche le tableau de routes de haut en bas et dès qu’une correspondance de chemin est trouvée, le module/composant correspondant est chargé. Dans votre cas, { path: '', loadChildren: './feed/feed.module#FeedModule', canActivate: [IsAuthenticationGuard] }
est une correspondance de chemin d’URL et donc Angular charge le module d’alimentation, mais n’affiche rien car la protection renvoie une erreur. Il ne même pas procéder à vérifier la correspondance d'URL pour la ligne ci-dessous.
Au lieu de cela, ce que vous pouvez faire est,
{ path: '', loadChildren:'./home/home.module#HomeModule', canActivate: [IsAuthenticationGuard] },
J'espère que cela résout votre objectif.