【问题标题】:Multiple layouts in nested routes in Angular (2+)Angular 中嵌套路由中的多个布局 (2+)
【发布时间】:2017-02-16 19:45:06
【问题描述】:

我正在创建一个类似仪表板的应用程序。我想在 Angular (2+) 中实现以下布局计划:

  • 路线-名称-布局
  • / - 主页 - 带有表格和图表等的全宽布局
  • /reports - 报告页面 - 相同的全宽布局,包含更多表格等
  • /login - 登录页面 - 没有全宽布局,只是屏幕中心的一个简单登录表单
  • /signup - 注册页面 - 没有全宽布局,只是屏幕中心的一个简单的注册表单
  • /messages - 电子邮件 - 全宽布局
  • /messages/new - 新电子邮件 - 中等布局,不继承全宽布局

等等……

所以基本上我想做的是在某些(子)路由上完全替换 <body> 的内容。

这对我不利:multiple layout for different pages in angular 2 因为我不想将 /(root)重定向到 /home 之类的任何地方。

这个也不适合:How to switch layouts in Angular2

任何帮助都会很棒!

【问题讨论】:

  • 你有机会检查我的答案吗?

标签: angular angular2-routing


【解决方案1】:

您可以使用子路由解决您的问题。

https://angular-multi-layout-example.stackblitz.io/查看工作演示或在https://stackblitz.com/edit/angular-multi-layout-example编辑

如下所示设置您的路线

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);

推荐参考:http://www.tech-coder.com/2017/01/multiple-master-pages-in-angular2-and.html

【讨论】:

  • 这正是我想要的!这是正确的答案。谢谢@Rameez!
【解决方案2】:

好的,我要试一试...

路线

可以通过多种方式创建路线。您可以使用子路由或直接为组件提供服务。

如果您想直接提供组件,这将是理想的,

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

您面临的直接问题

三个问题,

  1. 将组件显示为子组件。

  2. 在名为 fullwidth 的模板中显示组件

  3. 在名为 mediumwidth 的模板中显示组件

在你的 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 }
];

这将转发 URL 中的所有路径以查找这些路由。它将检查路线以查看它将落入哪个模板。

然后创建 3 个目录。

/空白

/完整

/中等

在这些文件夹中,您将保留使用每个母模板的组件。

所以由于登录是空白的。它会在 /blank

/blank/BlankComonent.ts

您还将在每个目录中创建一个路由文件,该文件在我们已经创建的初始路由文件中引用。

/blank/blank.routes.ts

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

然后在中等同样的事情,

/blank/blank.routes.ts

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

FULL_ROUTES 也是如此

为我们创建的每个目录创建一个路由文件。添加所有位于同一目录中并共享同一母模板的路由。

然后我们将创建一个模板目录。称之为/布局

现在在该目录中,您将在此处创建

空白组件.ts 全组件.ts 中组件.ts

这些组件中的每一个都将在这些模板中提供相应的路由。因为请记住我们的第一个routes 文件说我们将为这些templates 提供所有Child Routes

因此布局将提供给router-outlet

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

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

【讨论】:

  • 感谢您的广泛回答!但是,我的要求之一是不要将根 URL 重定向到任何地方。在您的示例中,您将其重定向到 /home。
  • 不,我的意思是你设置任何你想要的登陆页面是这样的。这样,当应用程序加载时,它会加载正确的页面。所以你的路线不会加载,直到他们到达那里被调用的路径。除此之外,如果这对您有帮助,您为什么不接受答案?另外,既然您问了另一个对您有帮助的问题,如果您也支持它,我将不胜感激。
  • 好的,给我一个工作示例来满足这个要求:url: localhost/ full layout, url: localhost/login blank layout。
  • 我刚做了。你能对你不知道怎么做的事情直言不讳吗?我无法在此处输入您需要的所有代码。您基本上是在要求我在堆栈溢出时为您布置整个项目。所以我可以建议的是为什么不尝试让一部分工作。然后理解它并在下一部分工作?
  • 你没有。另外,我已经告诉过你什么不起作用。看。我感谢您的帮助。我试图让这项工作几个小时。我多次尝试了您的代码,但再次,如果不将根路径重定向到某个东西,它就无法工作!这是不可接受的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多