J'utilise angular 2.0 final. J'essaie de changer l'emplacement du router-outlet dans le principal app.component.html. Le modèle est en train de se mettre à jour, sauf la première fois que j'utilise router.navigate, le composant ne s'affichera pas dans le nouveau routeur-prise et il n'y a pas d'erreur. La seconde et chaque fois après que j'utilise router.navigate, il fonctionne correctement.
exemple de template de app.component.html
<div *ngIf="authenticated() == false">
<h1>not logged in</h1>
<router-outlet>
</router-outlet>
</div>
<div *ngIf="authenticated()">
<h1>logged in</h1>
<router-outlet>
</router-outlet>
</div>
Je voudrais dire s'il vous plaît utilisez un router-outlet
nommé qui fonctionne parfaitement, mais le problème pour moi est que de telles URL ne sont pas du tout conviviales et je crois personnellement que les URL avec le nom du point de vente n'ont pas de sens,
ex:-
route
{ path : "forgotPassword", component :ForgotPassword , outlet : "notlogedin" }
sortie dans la barre d'adresse du navigateur
http: // localhost: 4200/(notlogedin: ForgotPassword)
voyez à quel point cela a l'air stupide dans la barre d'adresse.
par conséquent, si vous essayez d'utiliser *ngIf
pour désactiver conditionnellement et activer router-outlet
pour résoudre le problème, cela ne fonctionne pas. Un router-outlet
sera enregistré et quoi que vous fassiez, le prochain router-outlet
ne répondra pas aux changements d'itinéraire.
Alors voici la solution
En utilisant ngTemplateOutlet
et ng-template
, nous pouvons fournir une bonne solution à ce problème en ne gardant qu'un seul router-outlet
(voir l'exemple de code ci-dessous).
<ul>
<li><a routerLink="/login">login</a></li>
<li><a routerLink="/dashboard">dashboard</a></li>
</ul>
<!--This is where my before login router stays-->
<div class="logedIn-route" *ngIf="routerActive">
<ng-container *ngTemplateOutlet="template"></ng-container>
</div>
<!--This is where my after login router stays-->
<div class="logedout-route" *ngIf="!routerActive">
<ng-container *ngTemplateOutlet="template"></ng-container>
</div>
<ng-template #template>
<router-outlet>
</router-outlet>
</ng-template>
Essayez le violon
Vous devriez plutôt utiliser nommée router-outlet
.
Il est indiqué dans la documentation: Un modèle peut contenir exactement un nom non nommé.
<div *ngIf="authenticated() == false">
<h1>not logged in</h1>
<router-outlet name="notloggedin">
</router-outlet>
</div>
<div *ngIf="authenticated()">
<h1>logged in</h1>
<router-outlet name="loggedin">
</router-outlet>
</div>
Le routeur ressemblera à:
{ path: 'page1', component: Page1Component, outlet: 'notloggedin' },
{ path: 'page2', component: Page2Component, outlet: 'loggedin' }
Ici un exemple de @yurzui dans ce post .
Je devais utiliser ViewContainerRef
pour que mobile et poste de travail tirent parti du même port de routeur:
<!-- MOBILE -->
<div *ngIf="isMobile">
<div #mobileOutlet></div>
</div>
<!-- DESKTOP -->
<div *ngIf="!isMobile">
<div #desktopOutlet></div>
</div>
<ng-template #tpl>
<router-outlet></router-outlet>
</ng-template>
Et je n’ai eu aucun problème à utiliser createEmbeddedView
pour les deux:
@ViewChild('mobileOutlet', { read: ViewContainerRef }) _vcrMobile;
@ViewChild('desktopOutlet', { read: ViewContainerRef }) _vcrDesktop;
@ViewChild('tpl') tpl;
ngAfterViewInit() {
if (this.isMobile) this._vcrDesktop.createEmbeddedView(this.tpl);
else this._vcrMobile.createEmbeddedView(this.tpl);
}
la seule chose à faire est que vous devrez basculer cette prise si vous passez d'un point d'arrêt à un autre. Par exemple, du bureau au portable, redimensionnez:
this._vcrDesktop.clear();
this._vcrMobile.createEmbeddedView(this.tpl)