国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解Angular中實現自定義組件的雙向綁定的兩種方法

2024-05-06 15:27:47
字體:
來源:轉載
供稿:網友

在 Angular 中,對于表單元素,通過 [(ngModel)] 即可以簡單地實現雙向綁定。對于自定義組件而言,希望實現同樣的效果可以怎么做呢?

1 實現自定義組件的 ngModel 指令

如果希望自定義組件能夠具有與表單元素相同的 ngModel 效果,可以通過在組件內實現 ControlValueAccessor 接口達到目的。

對于 [(ngModel)] ,需要至少實現該接口的如下方法:

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

最簡單的核心實現示例參考如下。

import { ControlValueAccessor } from '@angular/forms/src/directives';import { Component, forwardRef, Input } from '@angular/core';import { NG_VALUE_ACCESSOR } from '@angular/forms';@Component({ selector: 'custom-input', template: `<input [(ngModel)]="value"/>`, providers: [  {   provide: NG_VALUE_ACCESSOR,   useExisting: forwardRef(() => UnionInputComponent),   multi: true  } ]})export class CustomInputComponent implements ControlValueAccessor { constructor() { } private innerValue: any = ''; private onTouchedCallback: () => void = function () { }; private onChangeCallback: (_: any) => void = function () { }; get value(): any {  return this.innerValue; } set value(v: any) {  if (v !== this.innerValue) {   this.innerValue = v;   this.onChangeCallback(v);  } } /**  * model view -> view value  */ writeValue(value: any) {  if (value !== this.innerValue) {   this.innerValue = value;  } } /**  * view value ->model value  */ registerOnChange(fn: any) {  this.onChangeCallback = fn; } registerOnTouched(fn: any) {  this.onTouchedCallback = fn; }}

2 使用 get/set 關鍵字實現父子組件的雙向綁定

其實實現雙向綁定內部的本質原理就是父子組件的事件綁定機制。簡單舉例如下。

2.1 自定義子組件定義

import { Input, Output, Component, EventEmitter } from '@angular/core';@Component({ selector: 'custom-input', template: `<input [(ngModel)]="innerValue"/>`,})export class CustomInputComponent { innerValue; @Input() get twoWayModel() {  return this.innerValue; } set twoWayModel(val) {  this.innerValue = val;  this.twoWayModelChange.emit(this.innerValue); } @Output() twoWayModelChange: EventEmitter<string> = new EventEmitter</string><string>();}

2.2 使用自定義組件

在需要使用組件的地方,通過 [(twoWayModel)] 即可實現雙向綁定的效果。

import { Input, Output } from '@angular/core';import { Component, forwardRef, Input } from '@angular/core';@Component({ selector: 'custom-input', template: `<custom -input [(twoWayModel)]="inputValue" (twoWayModelChange)="onInputValueChange($event)"></custom>`})export class abcComponent { inputValue; onInputValueChange(val) {  console.log(val);  console.log(val === this.inputValue); // true }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 宜丰县| 文山县| 河津市| 农安县| 秦皇岛市| 资中县| 资溪县| 望城县| 庆阳市| 武胜县| 武山县| 明溪县| 宜城市| 栾川县| 杭锦后旗| 静宁县| 土默特左旗| 蓝山县| 嘉峪关市| 伊川县| 罗山县| 宁陕县| 高唐县| 蒙自县| 彭阳县| 道孚县| 五华县| 昂仁县| 改则县| 眉山市| 高要市| 磐石市| 云阳县| 贵溪市| 昭苏县| 静宁县| 恩施市| 平南县| 保靖县| 岳西县| 故城县|