1
resposta

Login & Home Page com Lazy Loading

Atualmente, meu app-routing.ts está assim:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  { path: 'clientes', loadChildren: () => import('../../modules/cliente/cliente.module').then(m => m.ClienteModule) },
  { path: 'fornecedores', loadChildren: () => import('../../modules/fornecedor/fornecedor.module').then(m => m.FornecedorModule) },
  { path: 'produtos', loadChildren: () => import('../../modules/produto/produto.module').then(m => m.ProdutoModule) }
];

@NgModule({
  imports: [RouterModule.forRoot(routes, { scrollPositionRestoration: 'enabled' })],
  exports: [RouterModule]
})
export class AppRoutingModule { }

E o meu app.component.html está assim:

<body class="sb-nav-fixed">
    <app-topbar></app-topbar>

    <div id="layoutSidenav">
        <app-sidebar></app-sidebar>
        <div id="layoutSidenav_content">
            <app-content></app-content>
        </div>
    </div>
</body>

Sendo que o meu router-outlet está dentro de app-content:

<main>
    <div class="container-fluid">
        <router-outlet></router-outlet>
    </div>
</main>

A minha idéia é jogar o código que hoje está dentro de app.component.html para dentro de um layout.component.html, ficando o apenas um router-outlet dentro de app.component.html. Pois dessa maneira, o router-outlet seria populado com a página de login ou com o conteúdo do sistema (menus, etc) que estarão em layout.component.html.

A minha dúvida é: Como fazer isso mantendo o carregamento preguiçoso dos meus módulos (clientes, fornecedores, produtos)?

O problema são as "subrotas", que não estariam mais dentro de app-routing, eu imagino, mas sim dentro do módulo layout e, basicamente, passariam a existir dois router-outlet na aplicação. Sendo o primeiro para definir (login ou menus) e o segundo para as páginas em si (clientes, fornecedores, produtos...)

Tentei ontem a noite toda e não consegui chegar a lugar nenhum!

Se alguém puder me dar uma luz....

1 resposta

Olá, tudo bem?

Primeiramente, desculpa pela demora!

A lógica está correta, você precisaria de dois roteadores, o app-routing serviria apenas para definir se o carregamento a ser feito é do layout ou do login.

Depois, você teria dentro de layout as rotas do nível abaixo, que devem aparecer dentro dos componentes iniciais. Isso pode ser feito com um layout-routing.module.ts. O que você precisa é transferir as suas rotas com o carregamento lazy, para esse novo roteador, que importará o RouterModule.forChild() (veja mais aqui) ao invés de RouterModule.forRoot(). Depois importe o LayoutRouting no LayoutModule.

Já no app-routing, você pode fazer o lazy loading do módulo LayoutModule para rotas filhas de uma rota comum, como app ou home.

Novamente, desculpa pela demora, imagino inclusive que já tenha encontrado uma solução. De toda forma, espero que ajude!