angular - ControlValueAccessor:永远不会调用 registerOnChange()
问题描述
我正在构建一个 Angular 7 应用程序,该应用程序使用该ControlValueAccessor
界面使我的控件与 Reactive Forms 配合得很好。不幸的registerOnChange()
是,从未调用过,所以我无法“观察”我的控件的值。
我的控件的相关来源如下所示:
@Component({
selector: 'wp-date-picker',
templateUrl: './date-picker.component.html',
styleUrls: [ './date-picker.component.scss' ],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DatePickerComponent),
multi: true
}
]
})
export class DatePickerComponent implements OnInit, ControlValueAccessor {
onChange = (date: Date) => {};
onTouched = () => {};
writeValue(date: Date): void {
if (date) {
date = new Date(date);
this.day = date.getDate();
this.month = date.getMonth();
this.year = date.getFullYear();
}
}
get value(): Date {
return new Date(Date.UTC(this.year, this.month, this.day));
}
registerOnChange(fn: (date: Date) => void): void {
// never being called
this.onChange = fn;
}
}
并且包含的组件如下所示:
@Component({
selector: 'wp-retirement-age',
templateUrl: './retirement-age.component.html',
styleUrls: [ './retirement-age.component.scss' ]
})
export class RetirementAgeComponent implements OnInit {
form: FormGroup;
constructor(private fb: FormBuilder) {
}
ngOnInit() {
this.form = this.fb.group({
retirementDate: [ this.product.retirementDate ],
retirementAge: [ this.product.retirementDate ]
});
this.retirementDateCtrl.registerOnChange((newValue) => {
this.retirementAgeCtrl.setValue(newValue);
});
this.retirementAgeCtrl.registerOnChange((newValue) => {
this.retirementDateCtrl.setValue(newValue);
});
}
get retirementDateCtrl() {
return this.form.get('retirementDate') as FormControl;
}
get retirementAgeCtrl() {
return this.form.get('retirementAge') as FormControl;
}
}
我的组件有这个 HTML:
<form class="retirement-age-form" [formGroup]="form">
<div class="row">
<div class="col-3 col-md-4 col-lg-3">
<div [innerHtml]="content?.wantToRetire" class="options-title"></div>
</div>
<div class="col-3 col-md-4 col-lg-6">
<wp-date-picker
[maxDate]="maxDate"
[minDate]="minDate"
formControlName="retirementDate"
></wp-date-picker>
</div>
</div>
</form>
thethis.retirementDateCtrl.registerOnChange()
和 thethis.retirementAgeCtrl.registerOnChange()
都没有真正到达控件的registerOnChange()
方法,所以回调永远不会被执行。我错过了什么?
解决方案
推荐阅读
- amazon-web-services - Route53 指向其他 url(例如 API Gateway 端点)
- css - 无法更改 SVG 填充颜色
- c# - ASP.NET Core MVC - 无法返回带有视图的模型
- java - 如何使用文件提供程序从手机内部存储中打开 ppt 文件
- java - Gradle processResources 很慢 / IntelliJ 快速热交换静态资源
- swift - swift - 如何定义特定类型的间接枚举案例
- javascript - 如何向输入框添加附加值
- google-translate - 谷歌翻译 - 自动检测浏览器语言并翻译成英文
- python - EMR pyspark notebook Spark 进度小部件不见了
- visualization - 如何(视觉方式)表示测试用例(手动或自动)已经涵盖了哪些组件/流程?