2

我在我的 Angular 10 应用程序中有一个模板驱动的表单,我正在尝试监听更改,以便我可以向用户显示“已更改,请提交更新”消息。

HTML

<form (ngSubmit)="submit()" class="form-horizontal" #opportunityForm="ngForm">
...

机会.component.ts

export class OpportunityComponent implements OnInit {

  @ViewChild('opportunityForm') ngForm: NgForm;

  ngOnInit(): void {
    ...
    this.formChangesSubscription = this.ngForm.form.valueChanges.subscribe(x => {
      console.log(x);
    })

但它得到一个错误:

TypeError: Cannot read property 'form' of undefined

因为 ngForm 没有初始化。这是一个类似的问题:如何监听角度模板驱动的表单更改,在https://ng-run.com/edit/CGoUiw88N7OmI7x0YmHJ有一个运行的答案,它有同样的问题。

在我听取更改之前,如何获取表单并确保它存在?我正在使用 Angular 10.2.0

不确定这是否会有所不同,但整个页面都包含在

<div *ngIf="loaded">

这是在 ngOnInit 中的 api 调用之后设置的

ngOnInit(): void {
  this.dataService.getOpportunity(this.id)
        .subscribe(data => {
           ...  //fills the data up
        }, error => console.error(error),
        () => {
            console.log(this.loaded);
            console.log(this.ngForm);
        });

输出 true(对于已加载)和 undefined(对于 this.ngForm)。

更新*

所以看起来确实是因为我只有在数据返回后才加载整个表单。因为它不在页面上,所以 @ViewChild 可以连接到它。我把我的 *ngIf 放在表单内的一个 div 上,它工作正常

4

1 回答 1

2

尝试向装饰器添加static: true选项:@ViewChild

@ViewChild('opportunityForm', { static: true }) ngForm: NgForm;

Ng 运行示例

否则你必须将订阅移动到ngAfterViewInit钩子

于 2020-11-05T12:18:21.833 回答