天天看點

NgModule imports定義的運作時資料結構多層級注入器 ModuleInjector 與 ElementInjector

源代碼:

import {StoreModule} from '@ngrx/store';
import {reducers} from './reducer';
import { NgModule } from '@angular/core';
import { CounterComponent } from './container/component/counter/counter.component';
import { CommonModule } from '@angular/common';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import { BookManageComponent } from './container/component/bookmanage/book-manage.component';
import { SearchInputComponent } from './searchbookcomponents/search-input/search-input.component';
import { BookListComponent } from './searchbookcomponents/book-list/book-list.component';

import { BookDetailComponent} from './searchbookcomponents/book-detail/book-detail.component';

import {NgZorroAntdModule} from 'ng-zorro-antd';
import { BookManageService } from './service/book-manage.service';
import { EffectsModule } from '@ngrx/effects';
import { BookManageEffects } from './effects/book-manager.effect';

@NgModule({
  imports: [
    CommonModule,
    NgZorroAntdModule,
    FormsModule,
    ReactiveFormsModule,
    StoreModule.forFeature('example', reducers), // 這個才是關鍵哦,
    EffectsModule.forFeature([BookManageEffects])
  ],
  declarations: [CounterComponent, BookManageComponent,
    SearchInputComponent, BookListComponent, BookDetailComponent
  ],
  exports: [CounterComponent, BookManageComponent, BookListComponent, BookDetailComponent],
  providers: [BookManageService]
})
export class ExampleModule { }
      
NgModule imports定義的運作時資料結構多層級注入器 ModuleInjector 與 ElementInjector

core.js裡找到this.injectorDefTypes:

NgModule imports定義的運作時資料結構多層級注入器 ModuleInjector 與 ElementInjector

展開[[Entries]]:

NgModule imports定義的運作時資料結構多層級注入器 ModuleInjector 與 ElementInjector

找到ExampleModule下的imports區域:

NgModule imports定義的運作時資料結構多層級注入器 ModuleInjector 與 ElementInjector

應用程式代碼中定義的代碼:

StoreModule.forFeature('example', reducers)      

這個方法實際上傳回了一個module StoreFeatureModule,在運作時能夠看到:

NgModule imports定義的運作時資料結構多層級注入器 ModuleInjector 與 ElementInjector
NgModule imports定義的運作時資料結構多層級注入器 ModuleInjector 與 ElementInjector

應用程式編寫的reducer也會出現在這裡:

NgModule imports定義的運作時資料結構多層級注入器 ModuleInjector 與 ElementInjector

多層級注入器 ModuleInjector 與 ElementInjector

這部分闡述來自這篇知乎文章

詳解 Angular 依賴注入
NgModule imports定義的運作時資料結構多層級注入器 ModuleInjector 與 ElementInjector

ModuleInjector:通過 @NgModule() 或者 @Injectable() 配置

ElementInjector:通過 @Directive() 或 @Component() 中的 providers 屬性中配置

ModuleInjector

Injectable() 的 providedIn 屬性是要高于@NgModule() 的 providers 數組

當使用 Injectable() 的 providedIn 屬性時,優化工具可以做 tree-shaking,比如 providedIn: ‘root’

繼續閱讀