我正在通过Angular 2开发一个MEAN项目,我正在设置各种页面的路由。我已经看到很多使用ModuleWithProviders进行路由的示例,而不是使用NgModule(https://angular.io/guide/router)的angular.io示例
哪种标准的做事方式?如果其中任何一个都可以接受,两者之间是否存在性能差异?
ModuleWithProviders示例:
import { ModuleWithProviders } from '@angular/core';
import {Routes, RouterModule} from '@angular/router';
import { AppComponent } from './app.component';
import { AboutComponent } from './about/about.component';
import { ServicesComponent } from './services/services.component';
export const router: Routes = [
{ path: '', redirectTo: 'about', pathMatch: 'full'},
{ path: 'about', component: AboutComponent },
{ path: 'services', component: ServicesComponent }
];
export const routes: ModuleWithProviders = RouterModule.forRoot(router);
NgModule示例:
import { NgModule } from '@angular/core';
import {Routes, RouterModule} from '@angular/router';
import { AppComponent } from './app.component';
import { AboutComponent } from './about/about.component';
import { ServicesComponent } from './services/services.component';
export const router: Routes = [
{ path: '', redirectTo: 'about', pathMatch: 'full'},
{ path: 'about', component: AboutComponent },
{ path: 'services', component: ServicesComponent }
];
@NgModule({
imports: [
RouterModule.forRoot( router )
],
exports: [
RouterModule
]
})
export class AppRoutingModule {}
答案 0 :(得分:9)
NgModule和ModuleWithProviders是不同的东西。
NgModule
是模块类的装饰器。
forRoot
方法返回的 ModuleWithProviders
is the interface。 ModuleWithProviders
对象是具有ngModule
属性的普通对象,该属性包含使用providers
属性中的其他提供程序扩充的实际模块类。
由于ModuleWithProviders
是一个接口,因此它的用法是可选的。
答案 1 :(得分:9)
estus关于两者之间的区别是绝对正确的(@NgModule
是装饰者而ModuleWithProvider
是一个界面)但实际上,问题的答案是哪种方法更好将是:
第二种方法更清晰,更常见,也是最佳做法,因为它定义了单独模块中的路线,稍后会将其导入AppModule
:
export const routes: Routes = [
{ path: '', redirectTo: 'about', pathMatch: 'full'},
{ path: 'about', component: AboutComponent },
{ path: 'services', component: ServicesComponent }
];
const config: ExtraOptions = {
useHash: true
};
@NgModule({
imports: [RouterModule.forRoot(routes, config)],
exports: [RouterModule]
})
export class AppRoutingModule {}
导入AppModule
@NgModule({
declarations: [AppComponent],
imports: [AppRoutingModule],
bootstrap: [AppComponent],
})
export class AppModule {}
虽然上面提到的内容有希望回答您的问题,但我还想指出在RouterModule
和子模块中导入AppModule
之间的区别:
对于AppModule
:
RouterModule.forRoot(routes)
对于子模块:
RouterModule.forChild(routes)
为什么呢? RouterModule
为您提供
第一次在app模块中,forRoot
将为路由器组件提供并提供路由器服务。但是下一次在子模块中,forChild
将仅提供路由器组件(并且不再提供已通过应用程序模块导入提供的服务)。
想要阅读更多内容?我发现this article太棒了。