Oi Fabio,
Consigo te responder sua primeira dúvida nesse momento. Se puder, transforme os dois últimos itens em duas perguntas diferentes aqui no fórum. Isso vai ajudar a galera que tem a mesma dúvida que você a achar ela pela busca do fórum e até mesmo do google :)
Bora lá!
O que vc quer na primeira dúvida é o que chamamos isso de lazy loading dos componentes. O primeiro passo é tirar a declaração dos componentes lá do app.module
, como você disse que quer fazer. Tirando as declarações dos componentes, eles não serão carregados e aí nada mais vai funcionar, mas já arrumaremos isso.
Hoje em dia você tem um roteamento configurado para o app.module
todo. Nesse roteamento cada path
carrega um component
:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import {HomeComponent} from '../home/home.component'
import { HelloComponent } from '../hello/hello.component';
const routes: Routes = [
{path: "", component: HomeComponent},
{path: "hello", component: HelloComponent}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingRoutingModule { }
O que mudaria no lazy loading é que você não vai mais carregar um component
em cada path
, mas sim, um módulo que tenha o componente declarado e até mesmo outras subrotas lá dentro. Para isso, ao invés de component
, você passaria a usar a propriedade loadChildren
apontando para esse módulo:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import {HomeComponent} from '../home/home.component'
const routes: Routes = [
{path: "", component: HomeComponent},
{path: "hello", loadChildren: 'app/hello/hello.module#HelloModule'}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingRoutingModule { }
Note que o valor de loadChildren
é uma string e não a class
do módulo em si, justamente para que não haja necessidade de fazer o import
do módulo, afinal, queremos carregá-lo só quando a página for acessada.
Agora, dentro desse módulo HelloModule
, você deve declarar os componentes todos que quer que sejam carregados e criar e importar um novo módulo de roteamento apenas para o HelloModule
. Nesse módulo de roteamento novo, você pode voltar a dizer qual path
vai pra cada component
, só que com uma diferença, esse roteamento já está subentendido que é a partir da url hello
.
O HelloModule
ficaria assim:
import { NgModule } from '@angular/core';
import { HelloRoutingModule } from './hello-routing.module';
import { HelloComponent } from './hello.component';
@NgModule({
imports: [
HelloRoutingModule
],
declarations: [HelloComponent]
})
export class CustomersModule { }
E o módulo hello-routing.module
ficaria assim:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HelloComponent } from './hello.component';
const routes: Routes = [
{
path: '',
component: HelloComponent
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class HelloRoutingModule { }
Note que importamos um módulo de roteamento criado com RouterModule.forChild(routes)
. Isso significa que esse módulo de roteamento só tratara de subrotas. No nosso caso, todas as rotas que vierem como /hello/subrota
, por exemplo /helo/teste
. O path
para o componente HeloComponent ficou como path: ''
porque o component: HelloComponent
deve ser carregado quando a url for /hello/
.
Me diz depois o que achou e se funcionou pra vc