【问题标题】:Purpose of Import and Export in Angular @NgModule InitalizationAngular @NgModule 初始化中导入和导出的目的
【发布时间】:2018-02-21 22:02:50
【问题描述】:

我正在通过Angular Tour Of Heroes tutorial,我刚到路由器部分。我对他们为什么这样做感到困惑:

app-routing.module.ts 文件:

@NgModule({
    //Exporting the routermodule allows router directives available to AppModule components
    //This initialized the routermodule with routes so available through
    exports : [RouterModule],
    imports : [RouterModule.forRoot(routes)]
})

导出的真正作用是什么?我注意到如果我没有创建这个模块并在“app.module.ts”文件中完成这一切,我需要做的就是将 RouterModule.forRoot(routes) 添加到导入中。我什至不需要导入RouterModule。

我不明白的是,如果app.module.ts 将导入app-routing.module.ts 文件将导入RouterModule.forRoot(routes),为什么模块仍需要导出RouterModuleRouterModule.forRoot(routes) 不应该提供指令吗?

抱歉,这可能会造成混淆,但我无法理解导出的意义。

【问题讨论】:

    标签: angular


    【解决方案1】:

    这里发生了很多事情,我同意这可能是一个挑战,可以让您全神贯注。 imports 数组是您向模块注册依赖项的方式,exports 数组是您将这些依赖项声明为公共的方式,使其服务、指令、组件等可用于其他模块。

    既然您提到了RouterModule,我将使用它作为示例。 app.module.ts 是应用程序的根目录,在根目录下注册的任何模块都将可供整个应用程序使用。大多数应用程序都需要路由,因此您的应用程序需要 RouterModule。为了保持根模块中的代码干净,一种常见的模式是将路由逻辑整合到 app-routing-module.ts 中。

    为了使用 Angular 提供的所有路由服务/指令,您必须将 RouterModule 导入 app-routing.module.ts。通过导入 RouterModule,您可以使用它的指令在 app-routing.module.ts 中定义您的路由。现在,您的应用程序中只需要一个路由器服务实例。为此,您在导入 RouterModule 时调用了 forRoot() 方法。 forRoot() 方法是 Angular 建立的用于创建单例的约定,在这种情况下,它创建了路由器服务的单例(这是一个完全不同的主题,稍后再研究)。

    请记住,您希望在根模块 (app.module.ts) 中导入 app-routing.module.ts,以便在应用程序的根目录中注册您的路由。除此之外,您仍然希望能够在应用程序的其余部分中使用路由进行导航。为了实现这一点,您随后将 RouterModule 声明为 app-routing.module.ts 中的导出,从而当您在应用程序的根目录中注册 app-routing.module.ts 时,它的所有指令和服务可供应用程序的其余部分使用(app.moudle.ts)

    这是一个复杂的主题,有很多关于这个问题的好文章。要获得更详细的解释,我建议从这篇文章开始:

    In depth article on modules

    【讨论】:

    • 那我为什么不能只导出 RouterModule.forRoot(routes) (因为这也是一个模块)呢?
    • forRoot() 方法只返回一个提供者,即路由器服务。如果您只导出 RouterModule.forRoot(),那将没有多大意义。因为您将无法使用 RouterModule 必须在应用程序的其余部分中使路由成为可能的其余提供程序和指令。跨度>
    • 嗯,我想我明白了。在示例中,我们想使用路由器出口组件,它位于 RouterModule 中。通过导出它,任何导入它的人都可以使用所有指令、组件等,并允许我在 app.component 中使用该组件。我想我明白了,但约定真的很奇怪而且有点混乱。
    • 我很高兴它开始变得有意义,我很高兴我能提供帮助。肯定有很多要理解的。为了获得一个真正好的理解,了解更多关于 Angulars 编译过程、它对注入器的使用以及它如何应用于模块、提供程序和组件是有帮助的。如果我的回答对您有帮助,请标记一下。
    猜你喜欢
    • 2017-06-15
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多