Ich bin neu in Angular 4. Ich versuche, verschiedene Layout-Kopf- und Fußzeilen für verschiedene Seiten in meiner App festzulegen. Ich habe drei verschiedene Fälle:
- Anmelden, Seite registrieren (keine Kopf- und Fußzeile)
Routen: ['Login', 'Register']
- Marketing-Site-Seite (dies ist der Stammpfad und hat eine Kopf- und Fußzeile, meistens kommen diese Abschnitte vor der Anmeldung)
Routen: ['', 'about', 'contact']
- Angemeldete Seiten der App (Ich habe in diesem Abschnitt für alle App-Seiten eine andere Kopf- und Fußzeile, aber diese Kopf- und Fußzeile unterscheidet sich von der Kopf- und Fußzeile der Marketing-Site.)
Routen: ['Dashboard', 'Profil']
Ich führe die App vorübergehend aus, indem ich meiner Routerkomponente HTML eine Kopf- und Fußzeile hinzufüge.
Bitte raten Sie mir einen besseren Ansatz.
Das ist mein Code:
app \ app.routing.ts
const appRoutes: Routes = [
{ path: '', component: HomeComponent},
{ path: 'about', component: AboutComponent},
{ path: 'contact', component: ContactComponent},
{ path: 'login', component: LoginComponent },
{ path: 'register', component: RegisterComponent },
{ path: 'dashboard', component: DashboardComponent },
{ path: 'profile', component: ProfileComponent },
// otherwise redirect to home
{ path: '**', redirectTo: '' }
];
export const routing = RouterModule.forRoot(appRoutes);
app.component.html
<router-outlet></router-outlet>
app / home / home.component.html
<site-header></site-header>
<div class="container">
<p>Here goes my home html</p>
</div>
<site-footer></site-footer>
app / about / about.component.html
<site-header></site-header>
<div class="container">
<p>Here goes my about html</p>
</div>
<site-footer></site-footer>
app / login / login.component.html
<div class="login-container">
<p>Here goes my login html</p>
</div>
app / dashboard / dashboard.component.html
<app-header></app-header>
<div class="container">
<p>Here goes my dashboard html</p>
</div>
<app-footer></app-footer>
Ich habe diese Frage beim Stapelüberlauf gesehen, aber ich habe kein klares Bild von dieser Antwort erhalten
Antworten:
Sie können Ihr Problem mithilfe von untergeordneten Routen lösen.
Siehe Arbeitsdemo unter https://angular-multi-layout-example.stackblitz.io/ oder bearbeiten Sie sie unter https://stackblitz.com/edit/angular-multi-layout-example
Stellen Sie Ihre Route wie unten ein
quelle
{path: '',}
bedeutet nicht, dass der Pfad dort endet, er kann untergeordnete Routen haben. Wenn Sie dies jedoch verwenden{path: '',pathMatch: 'full',}
, endet der Umfang Ihrer Routenebene dort. Versuchen Sie, mit der von mir freigegebenen Stack-Bits-Demo zu spielen, und führen Sie einige Experimente durch, indem SiepathMatch
zu verschiedenen Ebenen der Routendefinition wechseln.Sie können Kind zB verwenden
MainComponent und AdminComponent mögen
In der Post geht es darum, die Routen in verschiedenen Dateien zu trennen
quelle
Es gibt Fälle, in denen das Layout und die gemeinsam genutzten Elemente nicht wirklich mit der Routing-Struktur übereinstimmen oder einige Elemente je nach Route ausgeblendet / angezeigt werden müssen. In solchen Fällen kann ich mir die folgenden Strategien vorstellen (nehmen wir ein Beispiel für eine
app-header-main
Komponente - dies gilt jedoch offensichtlich für alle gemeinsam genutzten Seitenelemente):Eingaben & CSS-Klassen
Sie können Eingaben oder CSS-Klassen bereitstellen, um das innere Erscheinungsbild Ihrer freigegebenen Elemente zu steuern, z.
<app-header-main [showUserTools]="false"></app-header-main>
oder
<app-header-main class="no-user-tools"></app-header-main>
und dann benutze: host (.no-user-tools), um zu zeigen / zu verbergen, was sein mussoder
auf Routenebene (Kind oder nicht):
Und
ActivatedRoute
wie folgt darauf zugreifen :this.route.data.header.showUserTools
TemplateRef-Eingabe
Innenkomponente
app-header-main
:@Input() rightSide: TemplateRef<any>;
Eingabe vom Typ,
TemplateRef<any>
bei der Sie einng-template
Element direkt füttern könnenBenannte Slot-Transklusion
Sie können den App-Header-Main so erstellen, dass er die benannte Slot-Transklusion verwendet
Innerhalb der App-Header-Hauptvorlage:
<ng-content select="[rightSide]"><ng-content>
Verwendung:
quelle
Sie können das Problem lösen, indem Sie ng-content + ViewChild-Layout in jede Seitenkomponente einfügen, die dieses bestimmte Layout verwendet.
Die Verwendung des Routers für diesen allgemeinen Anwendungsfall schien mir immer eine Problemumgehung zu sein. Was Sie möchten, ähnelt Layouts in Asp.Net MVC oder MasterPages in WebForm usw.
Nachdem ich damit zu kämpfen hatte, kam ich zu so etwas:
Siehe Arbeitsdemo: https://stackblitz.com/edit/angular-yrul9f
shared.component-layout.ts
page.component-base.ts
login.component.ts - ohne Header
home.component.ts - mit Header
quelle