代码之家  ›  专栏  ›  技术社区  ›  Chunbin Li

为什么使用路由器出口访问其他模块的组件不需要添加到导出

  •  5
  • Chunbin Li  · 技术社区  · 7 年前

    我不明白 router-outlet module's exports array 编译策略。

    enter image description here

    为什么我们需要将它添加到导出数组中,angular不能自动生成模块中定义的组件 路由器出口 .


    我知道如果我想使用其他模块的组件,就需要添加到导出中。

    live example

    import { NgModule } from '@angular/core';
    import { BrowserModule } from '@angular/platform-browser';
    import { FormsModule } from '@angular/forms';
    
    import { AppComponent } from './app.component';
    import { HelloComponent } from './hello.component';
    import { M1Module } from './m1/m1.module';
    // import { AppRoutingModule } from './app-routing.module';
    
    @NgModule({
      imports: [
        BrowserModule,
        // AppRoutingModule,
        M1Module
      ],
      declarations: [AppComponent, HelloComponent],
      bootstrap: [AppComponent]
    })
    export class AppModule { }
    
    
    ----------------------
    
    @NgModule({
      imports: [
        CommonModule
      ],
      declarations: [
        Comp1Component,
        Comp2Component
      ],
      exports: [
        Comp1Component
      ]
    })
    export class M1Module {}
    <hello name="{{ name }}"></hello>
    <p>
      Start editing to see some magic happen :)
    </p>
    
    
    <app-comp1></app-comp1>

    如果我通过路由访问组件 (http://example.domain.com/comp1) ,它不需要输出,可以工作。

    live example with routing

    import { AppComponent } from './app.component';
    import { HelloComponent } from './hello.component';
    import { M1Module } from './m1/m1.module';
    import { AppRoutingModule } from './app-routing.module';
    
    @NgModule({
      imports: [
        BrowserModule,
        AppRoutingModule,
        M1Module
      ],
      declarations: [AppComponent, HelloComponent],
      bootstrap: [AppComponent]
    })
    export class AppModule { }
    
    /*****************************************************/
    
    import { NgModule }             from '@angular/core';
    import { RouterModule, Routes } from '@angular/router';
    
    import { Comp1Component }   from './m1/comp1/comp1.component';
    import { Comp2Component }   from './m1/comp2/comp2.component';
    
    
    const routes: Routes = [
      { path: 'comp1', component: Comp1Component },
      { path: 'comp2', component: Comp2Component }
    ];
    
    @NgModule({
      imports: [ RouterModule.forRoot(routes) ],
      exports: [ RouterModule ]
    })
    export class AppRoutingModule {}
    
    
    /*****************************************************/
    
    import { NgModule } from '@angular/core';
    import { CommonModule } from '@angular/common';
    import { Comp1Component } from './comp1/comp1.component';
    import { Comp2Component } from './comp2/comp2.component';
    
    @NgModule({
      imports: [
        CommonModule
      ],
      declarations: [Comp1Component, Comp2Component],
    })
    export class M1Module { }
    <hello name="{{ name }}"></hello>
    <p>
      Start editing to see some magic happen :)
    </p>
    
    <!-- it's need to use export -->
    <!-- <app-comp1></app-comp1> -->
    
    <!-- it doesn't need to use export -->
    <router-outlet></router-outlet>

    谢谢,每个人的回答,这是我理解的总结:

    按模块的导出数组加载组件

    enter image description here

    路由器加载组件

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  4
  •   ConnorsFan    7 年前

    如中所述 Angular NgModule FAQs :

    我应该出口什么?

    导出组件所在的可声明类 其他ngmodules可以在它们的模板中引用。这些是 你的公共课。如果不导出一个声明类,它将保持 私有,仅对此NGmodule中声明的其他组件可见。

    我不应该出口什么?

    不要导出以下内容:

    只由路由器或引导程序动态加载的组件。 在另一个组件的 模板。虽然出口没有坏处,但也没有 效益。

    还要注意,路由器组件是 automatically added entryComponents 名单。

        2
  •  1
  •   Nambi N Rajan    7 年前

    NGmodule和scopes/可见性 混淆始于不具有相同范围/可见性的组件和服务:

    声明/组件在本地范围内(私有可见性), 提供者/服务(通常)在全局范围内(公共可见性)。 这意味着您声明的组件仅在当前模块中可用。如果需要在外部、其他模块中使用它们,则必须导出它们:

    但是路由器出口在运行时加载特定组件,所以我们不需要导出它们(这就是我的理解,如果我错了请原谅我)。

    推荐文章