【发布时间】:2019-11-02 06:04:00
【问题描述】:
如果自定义组件是另一个组件下的包装器,我不确定如何使用它。
喜欢:
ComponentA_withForm
|
--ComponentA1_withWrapperOfCustomInput
|
--ComponentA11_withCustomInput
如果我有这样的结构:
ComponentA_withForm
|
--ComponentA11_withCustomInput
一切都好
但对于我的情况(大量异步数据),我需要一个包装器......有没有可能以某种方式做到这一点?
这是我的小提琴代码:
组件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呢? -
@abd995我认为这也很肮脏:)
-
我认为这是您可能拥有的最干净的解决方案。传入表单控件或表单组是我猜的肮脏解决方案。
标签: javascript angular typescript components angular-reactive-forms