angular - 为什么使用router-outlet访问其他模块的组件不需要添加导出

标签 angular angular-routing angular-module angular-compiler

我不明白 router-outletmodule's exports array 编译策略的区别。

enter image description here

为什么我们需要将它添加到导出数组中,Angular 不能自动生成模块中定义的组件,如 router-outlet


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

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

最佳答案

Angular NgModule FAQs 中所述:

What should I export?

Export declarable classes that components in other NgModules are able to reference in their templates. These are your public classes. If you don't export a declarable class, it stays private, visible only to other components declared in this NgModule.

...

What should I not export?

Don't export the following:

Components that are only loaded dynamically by the router or by bootstrapping. Such entry components can never be selected in another component's template. While there's no harm in exporting them, there's also no benefit.

...

另请注意,路由器组件是 automatically addedentryComponents 列表。

关于angular - 为什么使用router-outlet访问其他模块的组件不需要添加导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50895196/

相关文章:

angular - 使用路由器 : Error cannot find module 延迟加载 Angular 模块

angular - 在功能模块中导入 HttpClientModule

html - 如何通过从列表中选择日期来显示信息

angular - AngularFire中的ERR_HTTP2_PROTOCOL_ERROR仅在特定设备上

angular - canActivateChild 被多次调用

angularjs 1.6.0(现在最新)路线不起作用

javascript - 如何在 Angular 8 的路由上加载模块?

html - 如何使用angular 5和bootstrap放置x按钮以清除输入字段中的内容

angular - Enter 按键的行为类似于 Angular 中的 Tab

javascript - 如何在另一个 Angular 应用程序的子路由中使用 Angular 应用程序?