模板選擇器直接實例化組件:html
解釋:根據已建立的組件工廠進行組件實例化,無須動態生成宿主元素(標籤)git
動態組件(工廠模式實例化組件)github
解釋:根據已經聲明的組件(靜態類d.ts)建立組件工廠再進行組件實例化,宿主元素(標籤)經過Host文件生成typescript
先說場景:編程
(1)NG官網的例子一個廣告位須要多個不一樣佈局的頁面進行切換,若是用ngIf,你就只能寫死多個模板在父組件裏(靜態)。bootstrap
(2)tab頁切換,能夠用上圖動態組件生成的例子;(scm系統和wms系統的tab頁看上去是路由錨點控制頁面切換,但實際也是披着動態組件的羊毛)segmentfault
二者對比:api
(1)展示方面:沒任何差異angular2
(2)工做量:二者其實沒什麼差異,但同在一個父組件下基本都是傳相同的參數值,那麼你寧願一個個寫在模板上,仍是寫在方法裏一勞永逸?app
(3)性能:ngIf——我第一時間就想到了ngIf帶來的註釋模板,頁面的變化都要進行變化檢測,模板有多個ngIf模板就會屢次判斷(強行解釋);其次這種懶加載方式能減小bundle的體積,加快首屏渲染速度
子問題1:enterComponents和聲明組件區別? 答:declarations——經過模板的selector建立組件,即聲明並建立;entryComponents——聲明不建立,等到用的時候才經過離線模板編譯器(OTC)根據entryComponents List的內容編譯已聲明的組件建立工廠,Angular使用entryComponents來啓用「tree shaking」,即只編譯項目中實際使用的組件,而不是編譯全部在ngModule中聲明但從未使用的組件,enterComponents在ng裏有三種表現形式,
@NgModule.bootstrap
裏聲明的啓動組件,如AppComponent。
擴展:
一句話分析這張圖片:ng的組件都是經過工廠函數(ComponentFactory<comp>)實例化出來,ngFactory.js文件負責裝載組件模板及變化檢測代碼片斷等靜態數據,變量早已經在編譯過程前開闢好內存空間,一切渲染過程都是以此爲媒介。剩下的就是coder的選擇是否用動態組件的方式加載,若是選用動態組件方式一定通過entryComponents的記錄,當頁面要加載這個組件時會OTC編譯聲明好的組件同時建立ngFactory.js 和 _Host_[x].ngFactory.js,前者渲染頁面(考慮IOS和Android)後者負責生成宿主元素,這個就是一個動態組件編譯過程。
其餘:動態組件考點不止這些,還有裝飾器@XXX、元數據的傳入能夠參考 Implementing custom component decorator ,
問題2:ng的依賴注入在軟件開發解決什麼?
答:依賴注入(Dependence Inject)是控制反轉(Inversion of Control 後)的行爲。
控制反轉——好萊塢的法則:「don‘t call us, we‘ll call you」。
緊耦合,誰也不能缺乏誰,對象或者模塊間經過互new的形式存在
實際場景,複雜且很差管理。
引入第三方把相應的對象/類(ng以服務形式存在)統一管理,並按需注入
最後,達到解耦的理想狀態
問題3:依賴注入不單單是調用服務,實戰還有更多新玩法。
概念篇——一、建立服務過程選擇@Injectable、@NgModule 仍是 @Component ?
二、provider入口API及各類提供商(useClass比較常見,適用於內部固定,外部變化多。useFactory對於權限控制即時變動狀態場景有用)
三、每一個組件建立一個注入器實例,服務實例在應用中是註冊屢次仍是僅有一次,是根據注入形式不一樣前者是@Component.provider後者是AppModule.provider (舉例:多種編輯會話,每一個組件須要一個特定的服務進行管理表單的新值和舊值,這種狀況必須使用@Component.provider,你能夠理解爲AppModule.provider註冊的就只有一個對象(單例),根模塊的提供商是向下傳遞到有須要用到該服務的組件中,而@Component.provider是爲每一個組件實例化獨立的服務)
實踐篇——一、組件能夠經過注入器,把本身注入到子組件上(服務=類)
二、類-接口寫法{provider: virtual, useClass: realClass},爲了節省內存,同時做爲Token而存在
三、出現引用循環,當即想到[{ provide: Parent, useExisting: forwardRef(() => AlexComponent) }]
四、僅找上一級的注入器服務添加@Host() 在服務建立前寫 @Host() private heroCache: HeroCacheService,防止服務沒找到用@Optional()
疑問:angular既然選擇了AOT編譯,那麼離線模板編譯器(OTC)在客戶端是以什麼形式存在?代碼片斷?
動態組件模塊相關文章
Angular進階:Angular編譯機制(AOT、JIT)
Implementing custom component decorator