Angular中的多个布局+延迟加载

时间:2018-02-28 09:19:02

标签: angular

我已经处理了几个Angular应用程序,但所有这些应用程序都在整个应用程序中使用了一个布局。

我现在正在将使用AngularJS + UI-Router构建的应用程序转换为Angular 5.使用AngularJS + UI-Router很容易让“主页”独立于您的路线,但我不会立即看到我的方式可以使用Angular 5路由器轻松重现这一点。

另外,我想保留使用延迟加载的可能性。

我想要实现的一个例子:

"/" application root
"/routeA" -> lazily loaded module
"/routeA/routeA01" -> default layout with header, footer, sidebar
"/routeA/routeA02" -> alternate layout with completely different html as used in route above

2 个答案:

答案 0 :(得分:2)

是的,这是可能的。

您需要一个父模块,我们称之为页面模块。它可以有一个包含主页面布局的页面组件:

pages.component.ts
pages.component.html

页面html模板就是这样,所以你真的不需要一个单独的文件,你可以在ts文件中声明它:

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

此组件已加载到您的页面模块中:

\ SRC \应用\页面\ pages.module.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { PagesComponent } from './pages.component';

@NgModule({
  imports: [
    CommonModule,
    routing    
  ],
  declarations: [ 
    PagesComponent,
  ]
})
export class PagesModule { }

pages模块有一个相应的routes文件(你可以在上面的文件中声明路由)。在这个例子中,我显示了2个延迟加载的模块,routeA和routeB:

\ SRC \应用\页面\ pates.routing.ts

import { Routes, RouterModule } from '@angular/router';
import { ModuleWithProviders } from '@angular/core';    
import { PagesComponent } from './pages.component';

export const routes: Routes = [
    {
        path: '',
        component: PagesComponent,
        children: [
            { path: 'routeA', loadChildren: 'app/pages/routeA/routeA.module#RouteAModule'},
            { path: 'routeB', loadChildren: 'app/pages/routeB/routeB.module#RouteBModule'},
        ]
    }
];

export const routing: ModuleWithProviders = RouterModule.forChild(routes);

最后是RouteA模块,其路由被声明为模块文件的一部分:

\ SRC \应用\页面\ routeA \ routeA.module.ts

import { NgModule, Component } from '@angular/core';
import { RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';

import { RouteA01Component } from './routeA01/routeA01.component.ts';
import { RouteA02Component } from './routeA02/routeA02.component.ts';   

export const routes = [
  { path: 'routeA01', component: RouteA01Component },
  { path: 'routeA02', component: RouteA02Component },
];

@NgModule({
  declarations: [
    RouteA01Component, 
    RouteA02Component, 
  ],
  imports: [
    CommonModule,
    RouterModule.forChild(routes);
  ],
  providers: [
  ]
})
export class RouteAModule { }

请注意,RouteA01和RouteA02是单独的路由和可以包含完全不同的html和css的单独组件。

修改

再次阅读你的问题我觉得它有点含糊不清,因为你说你希望RouteA01加载带标题,菜单,侧边栏的默认布局。通常,您会将其放入PagesComponent,然后将<router-outlet>放在您希望内容不同的位置。这样,RouteA01和RouteA02都将获得相同的“默认”标题,菜单,侧边栏,但内部的主要内容将根据加载的路径和子组件而改变。

但是,如果您希望RouteA02具有完全不同的布局(即不同的标题,菜单,侧边栏),那么您可以完全按照上面的说明进行操作,并且RouteA01和RouteA02组件都会声明其不同的标题,菜单和侧边栏

答案 1 :(得分:0)

我们说有2个功能页面

  1. 有一个 - 页眉,页脚和内容在中间。

  2. 另一个有 - 标题,文章,内容,但没有页脚。

  3. 功能页面将被路由到并使用unamed Router Outlet <router-outlet>显示。其中包含整个网站。

    布局特定路由(即辅助路由)应使用命名的路由器插座<router-outlet name="aside">完成。其中占据了整个可用屏幕房地产的一小部分。即便弹出也应该这样做!

    结帐:One Hungry Mind&amp; Auxiliary Routing Tut以便更好地理解。