J'ai une application Angular2 avec une sortie de routeur qui affiche différents composants en fonction du lien cliqué dans un menu latéral.
Le balisage du composant principal contenant le <router-outlet>
ressemble à ceci
<div *ngIf="authenticated == false">
<app-login></app-login>
</div>
<div *ngIf="authenticated">
<div class="page home-page">
<header class="header">
<app-navbar></app-navbar>
</header>
<div class="page-content d-flex align-items-stretch">
<div class="sidebar-container">
<app-sidebar-menu></app-sidebar-menu>
</div>
<div class="content-inner">
<app-page-header></app-page-header>
<div id="sub-content">
<router-outlet></router-outlet>
</div>
<app-footer></app-footer>
</div>
</div>
</div>
</div>
Si je clique sur le bouton Démonstration le composant de démonstration est affiché, mais si je clique ensuite sur le lien Accueil le composant "home" est rendu au-dessus du composant "demo" dans le DOM. En cliquant plusieurs fois sur les deux composants, vous obtiendrez un DOM semblable à celui-ci
<div _ngcontent-c0="" id="sub-content">
<router-outlet _ngcontent-c0=""></router-outlet>
<app-home _nghost-c6="">...</app-home>
<app-demo _nghost-c7="">...</app-demo>
<app-home _nghost-c6="">...</app-home> <!-- Why so many here? Should be just either one <app-home> or <app-demo> -->
<app-demo _nghost-c7="">...</app-demo>
<app-home _nghost-c6="">...</app-home>
<app-demo _nghost-c7="">...</app-demo>
<app-footer _ngcontent-c0="" _nghost-c5="">...</app-footer>
</div>
Les itinéraires sont définis comme suit
export const router: Routes = [
{ path: 'demo', component: DemoComponent, canActivate: [AuthGuard] },
{ path: 'home', component: HomeComponent, canActivate: [AuthGuard] }
]
Comment se fait-il que le <router-outlet>
ne remplace pas le composant, mais ajoute une autre "instance" du composant lors du passage d'un itinéraire à l'autre ?
1 votes
Wow ... il ne devrait certainement pas faire cela. Il remplace correctement le contenu dans mes applications utilisant un code similaire. Pouvez-vous faire un plunker qui reproduit l'erreur ? Ou fournir le code html pour le composant home dans votre question ci-dessus ?
0 votes
J'ai cru devenir fou ! Je travaille sur un plunker !
0 votes
Cela m'arrive également dans un composant d'onglets personnalisé. J'ai demandé à plusieurs personnes de l'examiner avec moi et je ne trouve rien. J'ai pensé que j'avais peut-être un *ngFor qui traînait quelque part et qui créait des divs pour chaque clic, mais ce n'est pas le problème. Si j'inspecte le code dans le navigateur, il montre le lien du routeur directement suivi d'une liste de composants qui est ajoutée à chaque clic. J'espère que quelqu'un pourra trouver une réponse rapidement.
0 votes
Intéressant, je ne suis pas en mesure de reproduire ce phénomène dans un Plunker, il se comporte exactement comme il le devrait. Je vais chercher un *ngFor, c'est une chose à laquelle je n'avais pas pensé ! Je vous tiens au courant !
0 votes
Juste une petite réflexion, utilisez-vous firebase ? Cela s'est produit juste après que j'ai implémenté firebase dans mon application.
0 votes
Oui, Firebase et AngularFire2 !
0 votes
Hmm. Il est peut-être en train de modifier la prise du routeur.
0 votes
Mise à jour. Cela ajoute également tous les modals au bas de la page (j'utilise les modals angular material) au même endroit que le contenu de mes onglets.
0 votes
Je viens de résoudre le mien. J'utilisais le pipe asynchrone sur un élément contenu dans un de mes onglets. J'ai supprimé le tuyau et cela fonctionne à nouveau.
0 votes
Intéressant ! J'ai un
| async
également, mais l'enlever ne m'apporte rien, si ce n'est de casser mes autres fonctionnalités :(0 votes
Hmmm... Eh bien, bonne chance. Je sais que le mien semblait être causé par une erreur avec | async. Vous pouvez résoudre les erreurs de la console et voir si cela vous aide. Je ne manquerai pas de poster ici si je trouve une réponse définitive.