国产探花免费观看_亚洲丰满少妇自慰呻吟_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 }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 富蕴县| 深州市| 汉阴县| 邓州市| 都安| 常德市| 兰溪市| 彭山县| 腾冲县| 锦州市| 蛟河市| 法库县| 偏关县| 图木舒克市| 阳朔县| 东台市| 济宁市| 涪陵区| 翼城县| 玉山县| 沙坪坝区| 治县。| 灵寿县| 曲松县| 眉山市| 屏南县| 封开县| 革吉县| 泾川县| 贡山| 雷山县| 驻马店市| 沈阳市| 岳阳县| 嫩江县| 河池市| 永清县| 环江| 宁南县| 桑植县| 和龙市|