4 votes

Mise en page multiple dans des routes imbriquées en Angular (2+)

Je suis en train de créer une application de type tableau de bord. J'aimerais réaliser le plan de disposition suivant en Angular (2+) :

  • itinéraire - nom - disposition
  • / - page d'accueil - mise en page pleine largeur avec tableaux et graphiques, etc.
  • /reports - page des rapports - même mise en page pleine largeur avec plus de tableaux, etc.
  • /login - page de connexion - pas de mise en page pleine largeur, juste un simple formulaire de connexion au centre de l'écran
  • /signup - page d'inscription - pas de mise en page pleine largeur, juste un simple formulaire d'inscription au centre de l'écran.
  • /messages - emails - mise en page pleine largeur
  • /messages/new - nouveau courriel - disposition moyenne, n'héritant pas de la disposition pleine largeur

etc...

Donc, en gros, ce que j'aimerais faire, c'est remplacer complètement le contenu du fichier <body> à certains itinéraires (enfants).

Ce n'est pas bon pour moi : mise en page multiple pour différentes pages dans angular 2 parce que je ne veux pas rediriger / (Root) vers un endroit comme /home.

Celui-ci ne convient pas non plus : Comment changer de mise en page dans Angular2

Toute aide serait la bienvenue !

10voto

Rameez Rami Points 736

Vous pouvez résoudre votre problème en utilisant des routes enfant.

Voir la démo de travail à https://angular-multi-layout-example.stackblitz.io/ ou modifier à https://stackblitz.com/edit/angular-multi-layout-example

Définissez votre itinéraire comme suit

const appRoutes: Routes = [

    //Site routes goes here 
    { 
        path: '', 
        component: SiteLayoutComponent,
        children: [
          { path: '', component: HomeComponent, pathMatch: 'full'},
          { path: 'about', component: AboutComponent }
        ]
    },

    // App routes goes here here
    { 
        path: '',
        component: AppLayoutComponent, 
        children: [
          { path: 'dashboard', component: DashboardComponent },
          { path: 'profile', component: ProfileComponent }
        ]
    },

    //no layout routes
    { path: 'login', component: LoginComponent},
    { path: 'register', component: RegisterComponent },
    // otherwise redirect to home
    { path: '**', redirectTo: '' }
];

export const routing = RouterModule.forRoot(appRoutes);

Référence recommandée : http://www.tech-coder.com/2017/01/multiple-master-pages-in-angular2-and.html

3voto

wuno Points 4612

Ok, je vais faire un essai...

Routes

La création d'itinéraires peut se faire de plusieurs manières. Vous pouvez utiliser des routes enfant ou servir le composant directement.

Si vous voulez servir le composant directement, ce serait idéal,

{ path: '*pathInURL*', component: *NameComponent* }

Les problèmes directs auxquels vous êtes confrontés

Trois problèmes,

  1. Afficher un composant en tant qu'enfant.

  2. Afficher un composant dans un modèle appelé fullwidth

  3. Afficher un composant dans un modèle appelé mediumwidth

Dans votre routes.ts

const APP_ROUTES: Routes = [
// landing page of your application
    { path: '', redirectTo: '/home', pathMatch: 'full', },
//anything that will be handled in blank template
    { path: '', component: BlankComponent, data: { title: 'blank Views' }, children: BLANK_ROUTES },
//anything that will be handled in fullwidth
    { path: '', component: FullComponent, data: { title: 'full Views' }, children: FULL_ROUTES },
// anything that will be handled in medium width
    { path: '', component: MediumComponent, data:{ title: 'Medium Views' }, children: MEDIUM_ROUTES }
];

Cela va transmettre tous les chemins dans l'URL à regarder à ces routes. Il vérifiera les routes pour voir dans quel modèle il se trouve.

Créez ensuite 3 répertoires.

/blank

/complet

/moyen

Dans ces dossiers, vous conserverez vos composants qui utilisent chacun des modèles mères.

Donc, puisque le login est vide. Il serait dans /blank

/blank/BlankComonent.ts

De plus, dans chacun de ces répertoires, vous créerez un fichier routes qui sera référencé dans le fichier routes initial que nous avons déjà créé.

/blank/blank.routes.ts

export const BLANK_ROUTES: Routes = [
    { path: 'login', component: LoginComponent }
];

Puis, au milieu, la même chose,

/blank/blank.routes.ts

export const MEDIUM_ROUTES: Routes = [
    { path: 'Some/Path', component: SomeMediumComponent }
];

Et ensuite la même chose pour FULL_ROUTES

Faites un fichier routes pour chaque répertoire que nous avons créé. Ajoutez toutes vos routes qui se trouvent dans le même répertoire et qui partageront le même modèle mère.

Ensuite, nous allons créer un répertoire de modèles. Appelez-le /layouts

Dans cette direction, c'est ici que vous allez créer

BlankComponent.ts FullComponent.ts MediumComponent.ts

Chacun de ces composants aura ses routes correspondantes servies à l'intérieur de ces modèles. Parce que rappelez-vous notre premier routes fichier dit que nous servirons tous Child Routes à ces templates .

Ainsi, les mises en page seront servies à la router-outlet

import { Component } from '@angular/core';

@Component({
    selector: 'body',
    template: '<router-outlet></router-outlet>'
})
export class AppComponent { 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X