Angular如何实现多级路由?
How to implement multi-level routing in Angular?
我正在做我的一个小项目,以便更多地了解 Angular,但我真的不知道如何实现多级路由。
我已阅读 documentation about the new release of the Router Component and also some other topics on StackOverlfow (first, , third),但找不到解决问题的方法。
让我们考虑以下 app 结构,而不考虑 Test 和 Test2 块。
让我们考虑我的应用程序的以下组件:
main.ts
import { bootstrap } from '@angular/platform-browser-dynamic';
import { MyAppComponent } from './my-app/my-app.component';
import { APP_ROUTER_PROVIDERS } from './my-app/my-app.routes';
bootstrap(MyAppComponent, [ APP_ROUTER_PROVIDERS ])
.catch(err => console.error(err));
我的-app.component.ts
import { Component } from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router';
@Component({
selector: 'my-app',
template: '<router-outlet></router-outlet>',
directives: [ROUTER_DIRECTIVES],
})
export class MyAppComponent { }
我的-app.routes.ts
import { provideRouter, RouterConfig } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';
import { SignUpComponent } from './sign-up/sign-up.component';
import { AdminRoutes} from './admin/admin.routes';
export const routes: RouterConfig = [
{ path: '', component: HomeComponent },
{ path: 'login', component: LoginComponent },
{ path: 'sign-up', component: SignUpComponent },
...AdminRoutes,
];
export const APP_ROUTER_PROVIDERS = [
provideRouter(routes)
];
admin.component.ts
import { Component } from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router';
@Component({
selector: 'admin',
template: 'Hello I am ADMIN <br> <router-outlet></router-outlet>',
directives: [ROUTER_DIRECTIVES]
})
export class AdminComponent { }
admin.routes.ts
import { RouterConfig } from '@angular/router';
import { AdminComponent } from './admin.component';
import { MainPageComponent } from './main-page/main-page.component';
import { SettingsComponent } from './settings/settings.component';
export const AdminRoutes: RouterConfig = [
{
path: 'admin',
component: AdminComponent,
children: [
{ path: 'main-page', component: MainPageComponent },
{ path: 'settings', component: SettingsComponent },
]
}
];
主-page.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'main-page',
template: 'Hello I am MAIN PAGE!!!'
})
export class MainPageComponent { }
settings.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'settings',
template: 'Hello I am SETTINGS!!!'
})
export class SettingsComponent { }
当我尝试使用这样的配置时,一切都不再起作用,浏览器的控制台充满了错误。
只有当我在 admin.routes.ts 中添加 children[...] 时才会发生这种情况,我认为问题就在那里。
- 你能给我一些关于如何正确实施的提示吗?
- 我错过了什么吗?
- 有没有更好的方法?
提前感谢您的帮助,我希望我在 post 中写的内容对理解我的问题有所帮助!
Angular 路由器将带有子路由的路由视为非终端路由,路由仅发生在终端路由上。
Angular 路由器希望路由具有 path: ''
的默认条目。
要解决此问题,您应该添加从父路由到其中一个子路由的重定向。
export const AdminRoutes: RouterConfig = [
{
path: 'admin',
component: AdminComponent,
children: [
{ path: '', redirectTo: 'main-page', terminal: 'true' },
{ path: 'main-page', component: MainPageComponent,
{ path: 'settings', component: SettingsComponent },
]
}];
编辑:如果使用 rc4 和路由器 3.0.0-beta2,他们已将 terminal
重命名为 pathMatch
。所以更新重定向路由如下:
{ path: '', redirectTo: 'main-page', pathMatch: 'full'},
我正在做我的一个小项目,以便更多地了解 Angular,但我真的不知道如何实现多级路由。
我已阅读 documentation about the new release of the Router Component and also some other topics on StackOverlfow (first,
让我们考虑以下 app 结构,而不考虑 Test 和 Test2 块。
让我们考虑我的应用程序的以下组件:
main.ts
import { bootstrap } from '@angular/platform-browser-dynamic';
import { MyAppComponent } from './my-app/my-app.component';
import { APP_ROUTER_PROVIDERS } from './my-app/my-app.routes';
bootstrap(MyAppComponent, [ APP_ROUTER_PROVIDERS ])
.catch(err => console.error(err));
我的-app.component.ts
import { Component } from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router';
@Component({
selector: 'my-app',
template: '<router-outlet></router-outlet>',
directives: [ROUTER_DIRECTIVES],
})
export class MyAppComponent { }
我的-app.routes.ts
import { provideRouter, RouterConfig } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';
import { SignUpComponent } from './sign-up/sign-up.component';
import { AdminRoutes} from './admin/admin.routes';
export const routes: RouterConfig = [
{ path: '', component: HomeComponent },
{ path: 'login', component: LoginComponent },
{ path: 'sign-up', component: SignUpComponent },
...AdminRoutes,
];
export const APP_ROUTER_PROVIDERS = [
provideRouter(routes)
];
admin.component.ts
import { Component } from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router';
@Component({
selector: 'admin',
template: 'Hello I am ADMIN <br> <router-outlet></router-outlet>',
directives: [ROUTER_DIRECTIVES]
})
export class AdminComponent { }
admin.routes.ts
import { RouterConfig } from '@angular/router';
import { AdminComponent } from './admin.component';
import { MainPageComponent } from './main-page/main-page.component';
import { SettingsComponent } from './settings/settings.component';
export const AdminRoutes: RouterConfig = [
{
path: 'admin',
component: AdminComponent,
children: [
{ path: 'main-page', component: MainPageComponent },
{ path: 'settings', component: SettingsComponent },
]
}
];
主-page.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'main-page',
template: 'Hello I am MAIN PAGE!!!'
})
export class MainPageComponent { }
settings.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'settings',
template: 'Hello I am SETTINGS!!!'
})
export class SettingsComponent { }
当我尝试使用这样的配置时,一切都不再起作用,浏览器的控制台充满了错误。
只有当我在 admin.routes.ts 中添加 children[...] 时才会发生这种情况,我认为问题就在那里。
- 你能给我一些关于如何正确实施的提示吗?
- 我错过了什么吗?
- 有没有更好的方法?
提前感谢您的帮助,我希望我在 post 中写的内容对理解我的问题有所帮助!
Angular 路由器将带有子路由的路由视为非终端路由,路由仅发生在终端路由上。
Angular 路由器希望路由具有 path: ''
的默认条目。
要解决此问题,您应该添加从父路由到其中一个子路由的重定向。
export const AdminRoutes: RouterConfig = [
{
path: 'admin',
component: AdminComponent,
children: [
{ path: '', redirectTo: 'main-page', terminal: 'true' },
{ path: 'main-page', component: MainPageComponent,
{ path: 'settings', component: SettingsComponent },
]
}];
编辑:如果使用 rc4 和路由器 3.0.0-beta2,他们已将 terminal
重命名为 pathMatch
。所以更新重定向路由如下:
{ path: '', redirectTo: 'main-page', pathMatch: 'full'},