无法获得使用 2 级延迟加载模块(嵌套)的路由
Unable to get route working with 2 levels of lazy loaded modules (nested)
我一直在尝试创建一个基于示例 cli 的 angular4 应用程序,其中包含一个主模块和 3 个产品模块(产品本身是一个延迟加载每个产品屏幕的路由参数)。
这是我的示例 - https://github.com/shankarvn/angular4lazyloading
重现步骤
cd 应用程序
npm 安装
ng 服务 -p 4003
在浏览器中 localhost:4003 => 应该加载 3 张显示产品 1、产品 2 和产品 3 的卡片。此时,单击 product1,您将看到路线更改和 product1 负载的 ui。现在点击仪表板,您将在控制台中看到一个错误
ERROR Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'product1/dashboard'
Error: Cannot match any routes. URL Segment: 'product1/dashboard'
at ApplyRedirects.noMatchError (router.es5.js:1404) [angular]
at CatchSubscriber.selector (router.es5.js:1379) [angular]
at CatchSubscriber.error (catch.js:104) [angular]
不确定我做错了什么 - 当延迟加载 product1 模块时,只是加载了仪表板路由。加载 product1 模块时,不应注册路由。感谢任何帮助。
谢谢。
你不应该使用 pathMatch: 'full'
export const Product1Routes: Routes = [
{
path: '',
component: Product1Component,
children:[
{
path: 'dashboard',
loadChildren: 'app/product1/dashboard/dashboard.module#DashboardModule'
// or './dashboard/...
},
{
path: '',
component: Product1ViewComponent
}
]
}
];
我还稍微更改了 loadChildren
路径。 (已添加 app/product1
)
为什么要为每个延迟加载的模块导入 HttpModule
?
这在惰性加载模块中也是多余的
providers: [{ provide: LocationStrategy, useClass: HashLocationStrategy }],
P.S. 我会为每个模块创建 Routing modules
app-routing.module.ts
product1-routing.module.ts
dashboard-routing.module.ts
等等
可能与这个问题有关(已在 Angular 5.2.1 上修复):Angular router '**' wildcard as a catch-all with child routes? Using latest 2.4.0 and Router 3.4.1
这是路由器的一个错误。
这是一个使用嵌套路由延迟加载的工作示例
https://github.com/PrashantMaheshwari-SoftwareEngineer/nested-route-lazy-loading
export const mainRoute: Route[] = [
{ path: "login", component: LoginComponent },
{ path: "home", loadChildren: "./layout/layout.module#LayoutModule" },
{ path: "", redirectTo: "/login", pathMatch: "full" }
];
export const layoutRoute: Route[] = [
{
path: "",
component: LayoutComponent,
children: [
{
path: "dashboard",
component: DashboardComponent
},
{
path: "employee",
component: EmployeeComponent
},
{
path: "customer",
component: CustomerComponent
},
{
path: "",
redirectTo: "dashboard",
pathMatch: "full"
}
]
}
];
我一直在尝试创建一个基于示例 cli 的 angular4 应用程序,其中包含一个主模块和 3 个产品模块(产品本身是一个延迟加载每个产品屏幕的路由参数)。
这是我的示例 - https://github.com/shankarvn/angular4lazyloading
重现步骤
cd 应用程序
npm 安装
ng 服务 -p 4003
在浏览器中 localhost:4003 => 应该加载 3 张显示产品 1、产品 2 和产品 3 的卡片。此时,单击 product1,您将看到路线更改和 product1 负载的 ui。现在点击仪表板,您将在控制台中看到一个错误
ERROR Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'product1/dashboard'
Error: Cannot match any routes. URL Segment: 'product1/dashboard'
at ApplyRedirects.noMatchError (router.es5.js:1404) [angular]
at CatchSubscriber.selector (router.es5.js:1379) [angular]
at CatchSubscriber.error (catch.js:104) [angular]
不确定我做错了什么 - 当延迟加载 product1 模块时,只是加载了仪表板路由。加载 product1 模块时,不应注册路由。感谢任何帮助。
谢谢。
你不应该使用 pathMatch: 'full'
export const Product1Routes: Routes = [
{
path: '',
component: Product1Component,
children:[
{
path: 'dashboard',
loadChildren: 'app/product1/dashboard/dashboard.module#DashboardModule'
// or './dashboard/...
},
{
path: '',
component: Product1ViewComponent
}
]
}
];
我还稍微更改了 loadChildren
路径。 (已添加 app/product1
)
为什么要为每个延迟加载的模块导入 HttpModule
?
这在惰性加载模块中也是多余的
providers: [{ provide: LocationStrategy, useClass: HashLocationStrategy }],
P.S. 我会为每个模块创建 Routing modules
app-routing.module.ts
product1-routing.module.ts
dashboard-routing.module.ts
等等
可能与这个问题有关(已在 Angular 5.2.1 上修复):Angular router '**' wildcard as a catch-all with child routes? Using latest 2.4.0 and Router 3.4.1
这是路由器的一个错误。
这是一个使用嵌套路由延迟加载的工作示例
https://github.com/PrashantMaheshwari-SoftwareEngineer/nested-route-lazy-loading
export const mainRoute: Route[] = [
{ path: "login", component: LoginComponent },
{ path: "home", loadChildren: "./layout/layout.module#LayoutModule" },
{ path: "", redirectTo: "/login", pathMatch: "full" }
];
export const layoutRoute: Route[] = [
{
path: "",
component: LayoutComponent,
children: [
{
path: "dashboard",
component: DashboardComponent
},
{
path: "employee",
component: EmployeeComponent
},
{
path: "customer",
component: CustomerComponent
},
{
path: "",
redirectTo: "dashboard",
pathMatch: "full"
}
]
}
];