亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

angular動態(tài)表單制作

 更新時間:2018年02月23日 14:10:55   作者:野生爬山虎  
通過實例代碼給大家詳細(xì)講述了angular動態(tài)表單的制作方法,對此有需要的朋友參考下。

源碼:https://github.com/Karin001/ngx-dynamic-form

動態(tài)表單使用場景

有時候我們需要一個靈活的表單,這個表單可以根據(jù)用戶的選擇,或者服務(wù)器返回的信息進(jìn)行重新配置,比如:增加或刪除一組input元素、一組select元素,等等。

在這樣的情況下,如果一開始就在模板里寫下所有的表單,利用一個ngif樹狀結(jié)構(gòu)進(jìn)行選擇控制,程序會變得比較冗余。

這時。程序最好是能夠根據(jù)用戶的選擇(driven by configuration)或者服務(wù)器的響應(yīng),自動生成所需要的表單。這就是動態(tài)表單要處理的業(yè)務(wù)。

組件生成的相關(guān)概念組件的兩個構(gòu)成

要動態(tài)生成表單,需要先理解組件是如何生成的。

一個angular組件由兩部分所組成。

Wrapper

Wrapper能夠與組件進(jìn)行交互,當(dāng)一個Wrapper初始化完成后,就已經(jīng)幫我們實例化了一個組件。同時,它也負(fù)責(zé)組件的change detection,以及觸發(fā)鉤子函數(shù)比如ngOnInit,ngOnChanges。

View

View負(fù)責(zé)呈現(xiàn)渲染過后的模板,將組件的外貌展示出來,并且能夠觸發(fā)Wrapper的change detection。一個組件可以有多個view,每一個view可以通過調(diào)用angular提供的兩個函數(shù)自行生成和銷毀,這個過程不用頂層的視圖參與。

組件的通常加載方式(非動態(tài)加載方式)

通常情況下,我們都是把組件內(nèi)嵌到根組件或者另一個組件當(dāng)中使用。嵌入的組件稱為子組件,被嵌入的稱為父組件。這時,當(dāng)我們的子組件代碼在被編譯時,會生成一個組件工廠component factory(這是angular核心類ComponentFactory的一個實例),和一個hsot view,host view負(fù)責(zé)本組件在父組件視圖內(nèi)生成該組件的dom節(jié)點,以及生成該組件的wrapper和view。

動態(tài)加載組件

而當(dāng)我們想要將一個動態(tài)組件插入某個組件視圖時,則無法取得這個動態(tài)組件的實例,因為這些是非動態(tài)組件編譯器做的事。

實現(xiàn)動態(tài)組件

angular提供了一些函數(shù)解決上面的難題,要使用這些函數(shù)我們需要注入兩個對象。

constructor(
 private componentFactoryResolver: ComponentFactoryResolver,
 private viewcontainerRef: ViewContainerRef,
 ) {
  
 }

我們注入了ComponentFactoryResolver,和ViewContainerRef。

ComponentFactoryResolver上提供了一個方法(resolveComponentFactory()),該方法接收一個組件類作為參數(shù),生成一個基于該組件類的組件工廠,也就是我們之前提到的那個組件工廠。

ViewContainerRef提供了一個方法(createComponent()),該方法接收組件工廠作為參數(shù),在該視圖中生成子組件。(我個人的理解是它處理了host view所做的事,為組件生成了wrapper和view)

實現(xiàn)動態(tài)表單

上文簡要的介紹了實現(xiàn)動態(tài)組件的一些技術(shù),現(xiàn)在開始思考如何做一個動態(tài)表單。

具體思路

我們想要做出一個獨立的動態(tài)表單模塊,當(dāng)我們想要使用動態(tài)表單時,只需簡單引入這個模塊,稍加配置即可使用。

我們希望這個模塊做好了后,在頂層使用者的角度會是這樣一個工作流程:

我們可以很容易的做出一個具有輸入屬性的組件,問題的核心在于這個組件是如何根據(jù)輸入屬性生成我們想要的表單。

也就是說,是它自己調(diào)用ComponentFactoryResolver和ViewContainerRef進(jìn)行組件的動態(tài)生成,還是交給別人處理。

下圖是實現(xiàn)思路:

實際上我們把動態(tài)表單拆分成了一個個小的動態(tài)組件(不預(yù)先加載),由外層的一個組件充當(dāng)一個容器,所有的動態(tài)組件都會在里面進(jìn)行生成和銷毀,他們共同組成了一個動態(tài)表單。調(diào)用ComponentFactoryResolver和ViewContainerRef生成組件的的這部分邏輯沒有集成在外層容器中,而是交給了一個自定義的指令和ng-container。因為指令沒有視圖,他通過注入ViewContainerRef獲取到的是宿主的視圖容器。由于ng-container不會被渲染,所以獲取到的視圖容器就是外層組件容器的視圖容器。

這么處理的好處就是不需要由外層組件統(tǒng)一對各個拆分的動態(tài)組件進(jìn)行管理,相當(dāng)于是由動態(tài)組件自己進(jìn)行管理。

外層組件容器大概會是下面這樣:

<form>
 <ng-container *ngFor="let config of configs" [自定義指令] >
 </ng-container>
</form>

configs是用戶的配置數(shù)據(jù),自定義指令寄宿在ng-container中,根據(jù)config渲染出各自的動態(tài)組件,而ng-container是透明的。

看一下代碼目錄結(jié)構(gòu),最后會是這個樣子

以上就是大體的實現(xiàn)思路了,具體還有許多細(xì)節(jié)可以關(guān)注文章開頭提到的那兩篇文章,講的很詳細(xì)。

相關(guān)文章

  • AngularJS入門教程(二):AngularJS模板

    AngularJS入門教程(二):AngularJS模板

    這篇文章主要介紹了AngularJS入門教程(二):AngularJS模板,本文是系列文章的第三篇,本系列會用一個項目來講解AngularJS的使用,需要的朋友可以參考下
    2014-12-12
  • 淺談AngularJS中$http服務(wù)的簡單用法

    淺談AngularJS中$http服務(wù)的簡單用法

    這篇文章主要介紹了淺談AngularJS中$http服務(wù)的簡單用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 總結(jié)十個Angular.js由淺入深的面試問題

    總結(jié)十個Angular.js由淺入深的面試問題

    這篇文章雖然只有10個問題,但是覆蓋了angular開發(fā)中的各個方面,有基本的知識點,也有在開發(fā)過程中遇見的問題,同時也有較為開放性的問題去辨別面試者的基礎(chǔ)水準(zhǔn)和項目經(jīng)驗,注意答案僅供參考哦~
    2016-08-08
  • 淺談Angular6的服務(wù)和依賴注入

    淺談Angular6的服務(wù)和依賴注入

    這篇文章主要介紹了淺談Angular6的服務(wù)和依賴注入,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 使用ng-packagr打包Angular的方法示例

    使用ng-packagr打包Angular的方法示例

    這篇文章主要介紹了使用ng-packagr打包Angular的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • AngularJS國際化詳解及示例代碼

    AngularJS國際化詳解及示例代碼

    本文主要介紹AngularJS國際化的知識,這里整理了相關(guān)資料和示例代碼以及實現(xiàn)效果圖,有興趣的小伙伴可以參考下
    2016-08-08
  • AngularJS 避繁就簡的路由

    AngularJS 避繁就簡的路由

    這篇文章主要為大家詳細(xì)介紹了AngularJS 避繁就簡的路由的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Angular.JS中指令ng-if的注意事項小結(jié)

    Angular.JS中指令ng-if的注意事項小結(jié)

    這篇文章主要給大家分享了關(guān)于Angular.JS中指令ng-if的一點注意事項,分享出來供大家參考學(xué)習(xí),文中介紹的還是相對來說比較詳細(xì),對大家具有一定的參考借鑒價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • 對angular 實時更新模板視圖的方法$apply詳解

    對angular 實時更新模板視圖的方法$apply詳解

    今天小編就為大家分享一篇對angular 實時更新模板視圖的方法$apply詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • div實現(xiàn)自適應(yīng)高度的textarea實現(xiàn)angular雙向綁定

    div實現(xiàn)自適應(yīng)高度的textarea實現(xiàn)angular雙向綁定

    本文主要介紹了div實現(xiàn)自適應(yīng)高度的textarea,實現(xiàn)angular雙向綁定的方法。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01

最新評論