gpt4 book ai didi

javascript - Angular:使用 ControlValueAccessor 自定义输入

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:57 26 4
gpt4 key购买 nike

如果自定义组件是另一个组件下的包装器,我不确定如何使用它。

喜欢:

ComponentA_withForm
|
--ComponentA1_withWrapperOfCustomInput
|
--ComponentA11_withCustomInput

如果我有这样的结构:

ComponentA_withForm
|
--ComponentA11_withCustomInput

一切顺利

但对于我的情况(大量异步数据),我需要一个包装器...是否有可能以某种方式做到这一点?

这是我的 fiddle 代码:

组件A:

import { Component } from '@angular/core';
import { FormBuilder } from '@angular/forms';

@Component({
selector: 'my-app',
template: `<form [formGroup]="form"><custom-input-wrapper formControlName="someInput"></custom-input-wrapper></form> <p>value is: {{formVal | json}}</p>`
})
export class AppComponent {
form = this.fb.group({
someInput: [],
});

get formVal() {
return this.form.getRawValue();
}

constructor(private fb: FormBuilder) { }
}

组件A1:

import { Component } from '@angular/core';

@Component({
selector: 'custom-input-wrapper',
template: '<custom-input></custom-input>',
})
export class CustomInputWrapperComponent {
constructor() { }
}

组件A11:

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

@Component({
selector: 'custom-input',
template: `Hey there! <button (click)="inc()">Value: {{ value }}</button>`,
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CustomInputComponent),
multi: true,
}],
})
export class CustomInputComponent implements ControlValueAccessor {

private value = 0;

writeValue(value: number): void {
this.value = value;
}

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

registerOnTouched(fn: any): void {
}

inc() {
this.value = this.value + 1;
this.onChangeFn(this.value);
}

onChangeFn = (_: any) => { };
}

这里我有一个工作示例: https://stackblitz.com/edit/angular-qmrj3a

所以:基本上删除和重构代码不使用 CustomInputWrapperComponent 使我的代码工作。但我需要这个包装器,但我不确定如何传递 formControlName

我不想要传递父 formGroup 的肮脏解决方案 :)

最佳答案

因为您不想要肮脏的解决方案 ;),您也可以在 CustomInputWrapperComponent 中实现 ControlValueAccessor。这样,父项中的任何更改都会反射(reflect)在子项中,子项中的任何更改也将反射(reflect)在父项中,只需几行代码。

包装组件

@Component({
selector: 'custom-input-wrapper',
template: '<custom-input [formControl]="value"></custom-input>',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CustomInputWrapperComponent),
multi: true,
}]
})
export class CustomInputWrapperComponent implements AfterViewInit, ControlValueAccessor {
public value = new FormControl();

constructor() { }

ngAfterViewInit() {
this.value.valueChanges.subscribe((x) => {
this.onChangeFn(x);
});
}

writeValue(value: number): void {
this.value.setValue(value);
}

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

registerOnTouched(fn: any): void {
}

onChangeFn = (_: any) => { };
}

父模板

<form [formGroup]="form"><custom-input-wrapper formControlName="someInput"></custom-input-wrapper></form> <p>value is: {{formVal | json}}</p>

我在这里制作了一个 stackbitz 演示 - https://stackblitz.com/edit/angular-csaxcz

关于javascript - Angular:使用 ControlValueAccessor 自定义输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56668673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com