Je me bats avec le framework Angular pour que mon application fonctionne correctement, mais je ne peux pas résoudre un problème de routage. J'ai une AppComponent
et un app-routing.module.ts
de niveau supérieur qui gèrent la navigation via ma SlideMenuComponent
personnalisée. Mon modèle HTML simplifié de AppComponent
:
<app-slide-menu [buttons]="menuButtons"></app-slide-menu>
<router-outlet></router-outlet>
Ma SlideMenuComponent
a le code HTML suivant comme noyau:
<nav><div *ngFor="let button of buttons">
<a routerLink="{{button.routerLink}}"
>{{button.name}}</a>
</div></nav>
Un utilisateur peut accéder à '/courses'
par le biais de ce menu de diapositives, supervisé par CoursesComponent
qui pagine les liens vers une CourseComponent
s particulière extraite du serveur. Ces composants résident dans leur propre module courses.module.ts
avec leur propre courses-routing.module.ts
. Mais lorsque je clique sur l'un de ces liens, la console Navigation triggered outside Angular zone, did you forget to call 'ngZone.run()'?
apparaît, ngOnInit()
n'est pas appelé pour ouvrir CourseCompontent
, et il ne se met pas à jour tant que je n'ai cliqué sur aucun des boutons de la page. J'avais ce problème lorsque je naviguais manuellement via router.navigate()
qui a été résolu en transmettant cette tâche à NgZone.runTask(router.navigate())
, mais pourquoi cela se produit-il avec les balises anchor
et les direcrives routerLink
? Voici mon extrait de code CoursesComponent
:
<nav><ul>
<li *ngFor="let course of api.data | paginate: {
currentPage: currentPage, itemsPerPage: limit, totalItems: api.total
}">
<a
[routerLink]="course._id"
[queryParams]="{ page: '1', limit: '5' }"
>
{{course.name}} ({{course.description}})
</a>
</li>
</ul></nav>
Un gif pour démontrer le problème:
Il voit un bug, essayez ceci comme solution de contournement
constructor(private ngZone: NgZone, private router: Router) {}
public navigate(commands: any[]): void {
this.ngZone.run(() => this.router.navigate(commands)).then();
}
Nous avions rencontré ce bogue lorsque nous naviguions quelque part dans notre solution.
Dans notre composant de barre latérale, nous utilisons la détection de changement on-Push et nous avons eu un this.ref.detectChanges()
lors du routage (changement de paramètres), ce qui a brisé le routage (éventuellement en lançant des résolveurs parallèles hors de ngZone ou similaire) .. this.ref.markForCheck()
ce bogue n'est plus apparu ..__ Je suis heureux que nous n'ayons pas besoin d'une solution de contournement, mais d'un comportement étrange ..
J'espère que cela aide tous ceux qui ont le même problème.