中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Angular中使用ControlValueAccessor創建自定義表單控件

發布時間:2021-05-17 18:04:28 來源:億速云 閱讀:143 作者:Leah 欄目:web開發

這篇文章給大家介紹如何在Angular中使用ControlValueAccessor創建自定義表單控件,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

ControlValueAccessor

ControlValueAccessor 是一個接口,充當Angular API 和 DOM 元素之間的橋梁

ControlValueAccessor 是一個連接表單模型和視圖(DOM元素)的接口,自定義的表單控件必須實現這個接口,它的作用是:

  • 把 form 模型中值映射到視圖中

  • 當視圖發生變化時,通知 form directives 或 form controls

Angular 引入這個接口的原因是,不同的輸入控件數據更新方式是不一樣的。例如,對于我們常用的文本輸入框來說,我們是設置它的 value 值,而對于復選框 (checkbox) 我們是設置它的 checked 屬性。實際上,不同類型的輸入控件都有一個 ControlValueAccessor,用來更新視圖

Angular 中常見的 ControlValueAccessor 有:

  • DefaultValueAccessor - 用于 text 和 textarea 類型的輸入控件

  • SelectControlValueAccessor - 用于 select 選擇控件

  • CheckboxControlValueAccessor - 用于 checkbox 復選控件

export interface ControlValueAccessor {
 writeValue(obj: any) : void
 registerOnChange(fn: any) : void
 registerOnTouched(fn: any) : void
}

writeValue(obj:any)是將表單模型中的值寫入視圖中。

writeValue(value: any): void {
 this._renderer.setProperty(this._elementRef.nativeElement, 'value', value);
}

registerOnChange(fn:any)是一個方法,用于注冊在視圖中的某些內容發生更改時應調用的處理程序。它獲取一個函數,告訴其他表單指令和表單控件更新其值。

registerOnChange(fn: (_: any) => void): void {
 this._onChange = fn;
}

registerOnTouched(fn:any)與registerOnChange()此類似,它專門為控件接收觸摸事件時注冊一個處理程序。

registerOnTouched(fn: any): void {
 this._onTouched = fn;
}

setDisabledState?(isDisabled: boolean): void; 是一個可選的方法,設置自定義表單的狀態

setDisabledState(isDisabled: boolean): void {
 this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled);
}

AbstractValueAccessor

我們可以把 ControlValueAccessor 中的方法寫在一個抽象類中,不同的組件可以實現這個基類

export abstract class AbstractValueAccessor implements ControlValueAccessor {
 
 private _value: any = '';
 
 get value(): any {
 return this._value;
 }

 set value(v: any) {
 if (v !== this._value) {
  this._value = v;
  this.onChange(v);
  this.onTouched();
 }
 }

 writeValue(value: any) {
 this._value = value;
 }

 onChange = (_) => {};
 onTouched = () => {};

 registerOnChange(fn: (_: any) => void): void {
 this.onChange = fn;
 }

 registerOnTouched(fn: () => void): void {
 this.onTouched = fn;
 }
}

export function MakeProvider(type: any): { provide: any, useExisting: any, multi: boolean} {
 return { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => type), multi: true };
}

關于如何在Angular中使用ControlValueAccessor創建自定義表單控件就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玛纳斯县| 神池县| 明光市| 大足县| 理塘县| 德保县| 海宁市| 汉阴县| 浮山县| 新民市| 通许县| 江源县| 巴林左旗| 五峰| 治县。| 婺源县| 都匀市| 内乡县| 碌曲县| 景德镇市| 青铜峡市| 得荣县| 西和县| 泽州县| 舟山市| 绥宁县| 弥勒县| 罗城| 禄劝| 龙胜| 墨玉县| 长兴县| 宿松县| 怀集县| 个旧市| 剑阁县| 钦州市| 海阳市| 大方县| 手游| 花莲市|