项目作者: migueluvieu

项目描述 :
Aplicación para establecer criterios sobre las rutas anidadadas. Nested Routing, Lazy-loading, Angular Material, Compodoc
高级语言: TypeScript
项目地址: git://github.com/migueluvieu/Angular-Training__Nested-Routes.git


Rutas en Angular

Proyecto generado con Angular CLI version 1.0.0-rc.0.

Aplicación para establecer criterios sobre las rutas anidadadas.
Se utiliza:


  • Routing (programática y declarativa)

  • Nested Routing

  • Lazy-loading

  • Angular Material

  • Compodoc

  • Comunicación entre componentes

  • Interface

  • Directivas estructurales

    • ngIf-else
    • ngFor
    • ngSwitch

Demo

Desplegada en firebase aquí



Navegación entre componentes

En esta aplicación se define un componente padre (se utiliza el app.component) y hijos (RedComponent, BlueComponent y GreenComponent. El app.component dispondrá de un router-outlet para renderizarlos. Se cargan con lazy-loading en este caso (se explica a continuación…)

  1. { path: 'blue', loadChildren: 'app/blue/blue.module#BlueModule' },
  2. { path: 'red', loadChildren: 'app/red/red.module#RedModule' },
  3. { path: 'green', loadChildren: 'app/green/green.module#GreenModule' }

Cada uno de los componentes tiene otros 3 componentes hijos (dentro de su módulo correspondiente)


  • BlueComponent:

    • BlueComponentLight

    • BlueComponentMedium

    • BlueComponentDark



  • RedComponent:

    • RedComponentLight

    • RedComponentMedium

    • RedComponentDark



  • GreenComponent:

    • GreenComponentLight

    • GreenComponentMedium

    • GreenComponentDark



Las rutas hijas de Redcomponent se definen de la siguiente forma:

  1. const routes: Routes = [
  2. {
  3. // Los componentes contenedores (RedComponent) necesitan tener un router-outlet para cargar sus hijos
  4. path: '', component: RedComponent,
  5. children: [
  6. // los componentes de las rutas hijas se renderizarán en el router-outlet definido siempre en el componente contenedor
  7. { path: 'light', component: RedLightComponent },
  8. { path: 'medium', component: RedMediumComponent },
  9. { path: 'dark', component: RedDarkComponent },
  10. // cuando pongan en el navegador pongan localhost:8080/red/ cargará el RedComponent ya que así lo mapeamos con el path ''
  11. // y en su router-routlet renderizará el dark por defecto, ya que con el path '' redireccionamos a /red/dark
  12. { path: '', redirectTo: 'dark', pathMatch: 'full'}
  13. ]
  14. }

Así queda el mapa de navegación (extensión Augury)



Las rutas pueden ir precedidas de /, ../ o nada. Establece la url.

Prefijos:


  • ‘/‘ Añade la ruta a la raíz de la aplicación

  • ‘’ añade la ruta a partir del componente contenedor

  • ‘../‘ añade ruta a la url a partir del componente padre del componente contenedor

Ejemplo:
partiendo que la ruta para el componente contenedor es http://my-server/../componenteContenedor/

  1. <a [routerLink]="['route-one']">Route One</a> -> http://my-server/../componenteContenedor/route-one
  2. <a [routerLink]="['../route-two']">Route Two</a> -> http://my-server/../route-two
  3. <a [routerLink]="['/route-three']">Route Three</a> ->http://my-server/route-three

Lazy-Loading

Los módulos son cargados dinámicasmente. Se genera bundle (chunks) de cada uno y se cargan bajo demanda
Módulos red, blue, green cargados mediante lazy-loading ({ path: ‘path’, loadChildren: ‘lazy-path#lazy-module’ },)

  1. { path: 'blue', loadChildren: 'app/blue/blue.module#BlueModule' },
  2. { path: 'red', loadChildren: 'app/red/red.module#RedModule' },
  3. { path: 'green', loadChildren: 'app/green/green.module#GreenModule' }



En el gráfico se pueden ver los chunk, al recargar la aplicación se cargan los bundles y el ‘2.chunk.js’ que se corresponde con el bundle para el módulo por defecto (blue.module). Al pulsar sobre ‘red’ se carga 0.chunk.js que se corresponde con el bundle del módulo ‘red.module’ y al pulsar sobre ‘green’ se carga el 1.chunk.js (green.module)

Angular Material

Se utiliza Angular Material para las templates.

Instalar angular material

  1. npm install --save @angular/material

Instalar modulo de animaciones, algún componente de AM lo utiliza en transiciones

  1. npm install --save @angular/animation

Importar módulo de material en principal y modulo de animaciones:

  1. imports: [
  2. BrowserModule,
  3. FormsModule,
  4. HttpModule,
  5. RouterModule.forRoot(routes),
  6. MaterialModule.forRoot(),
  7. BrowserAnimationsModule
  8. ]

Importar en css uno de los temas del prebuilt y la material icons . Para ello en styles.css

En el resto de módulos no se añadiría el forRoot()…

  1. @import '~https://fonts.googleapis.com/icon?family=Material+Icons';
  2. @import '~@angular/material/prebuilt-themes/deeppurple-amber.css';

Documentación

Ver Documentacion de la aplicación aqui

Se utiliza compodoc

Generar documentación

Instalación global

  1. npm install -g @compodoc/compodoc

Instalación local

  1. npm install --save-dev @compodoc/compodoc

Definir script en package.json (se añade -a screenshots para llevar la carpeta de screenshots al generado, y el theme)

  1. "scripts": {
  2. "compodoc": "./node_modules/.bin/compodoc -p tsconfig.json -a screenshots"
  3. }

Lanzar script

  1. npm run compodoc

Se genera carpeta /documentation

Deploy firebase

Se crea script en el package.json que borra /dist, genera el build para prod, documentación y despliega en firebase

  1. "scripts": {
  2. ...
  3. "compodoc": "./node_modules/.bin/compodoc -p tsconfig.json -a screenshots",
  4. "deploy-firebase": "del dist && ng build --env=prod --aot && npm run compodoc && move documentation dist && firebase deploy"
  5. }