本篇文章跟大家介紹一下Angular使用ControlValueAccessor實作自訂表單控制項的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
Angular: [ControlValueAccessor] 自訂表單控制項
我們在實際開發中,通常會遇到各種各樣的客製化功能,會遇到有些元件會與Angular 的表單進行交互,這時候我們一般會從外部傳入一個FormGroup 對象,然後在元件的內部寫相應的邏輯對Angular 表單進行操作。如果我們只是對表單中的一個項目進行定制,將整個表單物件傳入顯然不合適,並且組件也會顯得臃腫。
<form [formGroup]="simpleForm"> <br/> <other-component [form]="simpleForm"></other-component> <br/></form><br/>
那麼,我們能不能像原生表單一樣去使用這些自訂元件呢?目前,開源元件 ng-zorro-antd 表單元件能和原生表單一樣使用 formControlName 這個屬性,這類元件就叫自訂表單元件。 【相關推薦:《angular教學》】
如何實作自訂表單控制項
在Angular 中,使用ControlValueAccessor 可以實現元件與外層包裹的form 關聯起來。
ControlValueAccessor是用於處理以下內容的介面:
- 將表單模型中的值寫入檢視/ DOM
- 在檢視/ DOM變更時通知其他表單指令與控制項
ControlValueAccessor
ControlValueAccessor 介面定義了四種方法:
writeValue(obj: any): void<br/><br/>registerOnChange(fn: any): void<br/><br/>registerOnTouched(fn: any): void<br/><br/>setDisabledState(isDisabled: boolean)?: void<br/>
writeValue(obj:any)
:將表單模型中的新值寫入視圖或DOM屬性(如果需要)的方法,它將來自外部的資料寫入到內部的資料模型。資料流向: form model -> component。
registerOnChange(fn:any)
:一種註冊處理程序的方法,當視圖中的某些內容發生變更時應呼叫該處理程序。它具有一個告訴其他表單指令和表單控制項以更新其值的函數。通常在 registerOnChange 中需要保存該事件觸發函數,在資料改變的時候,可以透過呼叫事件觸發函數通知外部資料變了,同時可以將修改後的資料作為參數傳遞出去。資料流向: component -> form model。
registerOnTouched(fn: any)
:註冊 onTouched 事件,基本上同 registerOnChange ,只是函數用來通知表單元件已經處於 touched 狀態,改變綁定的 FormControl 的內部狀態。狀態變更: component -> form model。
setDisabledState(isDisabled: boolean)
:當呼叫FormControl 變更狀態的API 時得表單狀態變為Disabled 時呼叫setDisabledState() 方法,以通知自訂表單元件目前表單的讀取寫狀態。狀態變更: form model -> component。
如何使用ControlValueAccessor
#建置控制項框架
@Component({<br/> selector: 'app-test-control-value-accessor',<br/> templateUrl: './test-control-value-accessor.component.html',<br/> providers: [{<br/> provide: NG_VALUE_ACCESSOR,<br/> useExisting: forwardRef(() => TestControlValueAccessorComponent),<br/> multi: true<br/> }]<br/>})<br/>export class TestControlValueAccessorComponent implements ControlValueAccessor {<br/><br/> _counterValue = 0;<br/> <br/> private onChange = (_: any) => {};<br/><br/> constructor() { }<br/><br/> get counterValue() {<br/> return this._counterValue;<br/> }<br/><br/> set counterValue(value) {<br/> this._counterValue = value;<br/> // 触发 onChange,component 内部的值同步到 form model<br/> this.onChange(this._counterValue);<br/> }<br/><br/> increment() {<br/> this.counterValue++;<br/> }<br/><br/> decrement() {<br/> this.counterValue--;<br/> }<br/><br/> // form model 的值同步到 component 内部<br/> writeValue(obj: any): void {<br/> if (obj !== undefined) {<br/> this.counterValue = obj;<br/> }<br/> }<br/><br/> registerOnChange(fn: any): void {<br/> this.onChange = fn;<br/> }<br/><br/> registerOnTouched(fn: any): void { }<br/><br/> setDisabledState?(isDisabled: boolean): void { }<br/><br/>}<br/>
註冊ControlValueAccessor
為了獲得ControlValueAccessor
用於表單控件,Angular 內部將注入在NG_VALUE_ACCESSOR
令牌上註冊的所有值,這是將控製本身註冊到DI
框架成為一個可以讓表單存取其值的控制項。因此,我們需要做的就是NG_VALUE_ACCESSOR
使用我們自己的值存取器實例(這是我們的元件)來擴充 multi-provider 。所以設定 multi: true
,是宣告這個 token
對應的類別很多,分散在各處。
這裡我們必須使用 useExisting
,因為TestControlValueAccessorComponent
可能在使用它的元件中被其建立為指令依賴項。這就得用到 forwardRef
了,這個函數允許我們引用一個尚未定義的物件。
@Component({<br/> ...<br/> providers: [<br/> { <br/> provide: NG_VALUE_ACCESSOR,<br/> useExisting: forwardRef(() => TestControlValueAccessorComponent ),<br/> multi: true<br/> }<br/> ]<br/>})<br/>export class TestControlValueAccessorComponent implements ControlValueAccessor {<br/> ...<br/>}<br/>
控制項介面
- test-control-value-accessor.component.html
<div class="panel panel-primary"><br/> <div class="panel-heading">自定义控件</div><br/> <div class="panel-body"><br/> <button (click)="increment()">+</button><br/> {{counterValue}}<br/> <button (click)="decrement()">-</button><br/> </div><br/></div><br/>
#在表單中使用
- app.component.html
<div class="constainer"><br/> <form #form="ngForm"><br/> <app-test-control-value-accessor name="message" [(ngModel)]="message"></app-test-control-value-accessor><br/> <button type="button" (click)="submit(form.value)">Submit</button><br/> </form><br/> <pre class="brush:php;toolbar:false">{{ message }}
- app.component.ts
@Component({<br/> selector: 'app-root',<br/> templateUrl: './app.component.html',<br/> styleUrls: ['./app.component.css']<br/>})<br/>export class AppComponent {<br/><br/> message = 5;<br/><br/> submit(value: any): void {<br/> console.log(value);<br/> }<br/><br/>}<br/>
#參考
https://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular- 2.html
https://almerosteyn.com/2016/04/linkup-custom-control-to-ngcontrol-ngmodel
## https://juejin.im/post/597176886fb9a06ba4746d15
https://github.com/shhdgit/blogs/issues/11
更多程式相關知識,請造訪:程式設計影片! !
以上是詳解Angular使用ControlValueAccessor實作自訂表單控制項的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具

Dreamweaver CS6
視覺化網頁開發工具