91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

angular4怎么通過自定義組件實現ngModel雙向數據綁定

發布時間:2021-06-16 17:16:22 來源:億速云 閱讀:363 作者:Leah 欄目:web開發

今天就跟大家聊聊有關angular4怎么通過自定義組件實現ngModel雙向數據綁定,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

app-child組件:

import { Component, forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

@Component({
 selector: 'app-child',
 templateUrl: './child.component.html',
 styleUrls: ['./child.component.css'],
 providers: [{
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => ChildComponent),
  multi: true
 }]
})
export class ChildComponent implements ControlValueAccessor {
 constructor() { }
 _data: any;
 add () {
  this.childData ++;
 }
 change = (value: any) => {}; // 先定義一個方法,很重要,用于接收registerOnChange()方法里傳遞回來的方法,然后通過這個方法就能通知到外部組件數據更新。
 set childData(value: number) { // childData被更改走該方法
  this._data = value;
  this.change(this._data); // 將更新后的數據通知到外部組件
 }
 get childData() { // 頁面或者方法里面有調用childData就會走該方法
  return this._data;
 }
 writeValue(val): void { // 初始化時,獲取并監聽父組件通過ngModel傳遞進來的數據
  if (val) {
   this._data = val;
  }
 }
 registerOnChange(fn: any): void { // 初始化后,執行該方法,并保存控件接收到 change 事件后,調用的函數
  this.change = fn;
 }
 registerOnTouched(fn: any): void {
 }
}

3、下面開始說下實現的過程吧:

如果添加ngModel后報如下錯誤,檢查組件對應的Module文件有沒有導入FormsModule

angular4怎么通過自定義組件實現ngModel雙向數據綁定

import { FormsModule } from '@angular/forms';
@NgModule({
 ...
 imports: [
  ...,
  FormsModule
 ],
 ...
})

import FormsModule后,控制臺任然會報錯:

angular4怎么通過自定義組件實現ngModel雙向數據綁定

這是因為我們需要在使用ngModel的組件里實現ControlValueAccessor的接口方法。

先引入和使用我們必須使用的配置:

import { Component, forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

@Component({
 selector: 'app-child',
 templateUrl: './child.component.html',
 styleUrls: ['./child.component.css'],
 providers: [{
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => ChildComponent), // 這里的組件名為當前組件的名字
  multi: true
 }]
})
export class ChildComponent implements ControlValueAccessor {
 constructor() { }
 childData = 2;
}

處理完成后控制臺的報錯信息已經改變:

angular4怎么通過自定義組件實現ngModel雙向數據綁定

這是因為ControlValueAccessor的接口有幾個必須存在的方法,會自動去調用:

 writeValue(val): void {
 }
 registerOnChange(fn: any): void {
 }
 registerOnTouched(fn: any): void {
 }
  • 初始化的時候調用  writeValue()  方法,將會使用表單模型中對應的初始值作為參數(也就是ngModel里的值)。

  • registerOnChange() 可以用來通知外部,組件已經發生變化。

  • registerOnTouched() 方法用于設置當控件接收到 touched 事件后,調用的函數。

知道了這三個方法后,我們就可以在writeValue方法里給組件設置父組件通過ngModel傳遞過來的值了。如:

writeValue(val): void {
 if (val) {
  this.childData = val;
 }
}

那么怎么將組件里更新的數據傳遞給父組件吶。

registerOnChange(fn: any): void { // 初始化后,執行該方法,并保存控件接收到 change 事件后,調用的函數
 this.change = fn;
}

writeValue()方法后就會執行registerOnChange()方法,我們就是通過該方法傳遞回來的方法參數來通知到外部組件數據更新的,所以我們要在最開始就定義一個方法來接收。

change = (value: any) => {}; 
// 先定義一個方法,很重要,用于接收registerOnChange()方法里傳遞回來的方法,然后通過這個方法就能通知到外部組件數據更新。

然后就可以通過change方法通知外部組件了

set childData(value: number) { // childData被更改走該方法
 this._data = value;
 this.change(this._data); // 將更新后的數據通知到外部組件
}

最開始貼出來的代碼,中間使用了set 和get去處理了數據,在get childData()方法里打斷點發現會執行很多次該方法,其實也可以修改成通過更新數據的時候就直接調用change()方法來通知外部組件數據更新,如下:

import { Component, forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

@Component({
 selector: 'app-child',
 templateUrl: './child.component.html',
 styleUrls: ['./child.component.css'],
 providers: [{
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => ChildComponent),
  multi: true
 }]
})
export class ChildComponent implements ControlValueAccessor {
 constructor() { }
 _data: any;
 childData = 1;
 add () {
  this.childData ++;
  this.change(this.childData);
 }
 change = (value: any) => {}; // 先定義一個方法,很重要,用于接收registerOnChange()方法里傳遞回來的方法,然后通過這個方法就能通知到外部組件數據更新。
 writeValue(val): void { // 初始化時,獲取并監聽父組件通過ngModel傳遞進來的數據
  if (val) {
   this.childData = val;
  }
 }
 registerOnChange(fn: any): void { // 初始化后,執行該方法,并保存控件接收到 change 事件后,調用的函數
  this.change = fn;
 }
 registerOnTouched(fn: any): void {
 }
}

看完上述內容,你們對angular4怎么通過自定義組件實現ngModel雙向數據綁定有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

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

AI

浏阳市| 肥城市| 大冶市| 兰州市| 青龙| 海门市| 肇源县| 黄骅市| 自治县| 鄂托克旗| 山丹县| 灵石县| 沁阳市| 香格里拉县| 汤原县| 靖西县| 班玛县| 平顺县| 阿鲁科尔沁旗| 肃宁县| 昌吉市| 湾仔区| 抚宁县| 静乐县| 乌鲁木齐县| 绥德县| 荆门市| 祁门县| 两当县| 太康县| 太谷县| 凌云县| 当涂县| 左贡县| 武川县| 洛阳市| 化隆| 台江县| 浦江县| 北辰区| 右玉县|