在实现ControlValueAccessor时,可能会遇到这样的问题:当我们在子组件改变了ControlValueAccessor所绑定的FormControl的值时,该值无法自动同步更新到父组件的表单。这时需要在子组件中手动触发值变化事件。请参考下面的代码示例:
父组件模板:
父组件代码:
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
@Component({
selector: 'app-my-app',
template: `
`
})
export class MyApp implements OnInit {
myForm: FormGroup;
ngOnInit() {
this.myForm = new FormGroup({
myControl: new FormControl('')
});
}
}
子组件模板:
子组件代码:
import { Component, forwardRef, Input } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
@Component({
selector: 'app-my-component',
template: `
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => MyComponent),
multi: true
}
]
})
export class MyComponent implements ControlValueAccessor {
@Input()
value: string;
private onChange: (value: string) => void;
private onTouch: () => void;
onBlur() {
this.onTouch();
}
writeValue(value: string): void {
this.value = value;
}
registerOnChange(onChange: (value: string) => void): void {
this.onChange = onChange;
}
registerOnTouched(onTouch: () => void): void {
this.onTouch = onTouch;
}
// 增加一个方法手动触发值变化事件
public triggerValueChanges() {
this.onChange(this.value);
}
}
在父组件中,使用ViewChild获取子组件实例,并手动触发值变化事件:
import { Component, AfterViewInit, ViewChild } from '@angular/core';
import