angular - 从组件更改模型时未调用 ngModelChange
问题描述
我是 Angular 的新手,我正在尝试了解如何连接不同的控制器,以便在控制器更改时更改控制器的值。
在这种特殊情况下,我有一个带有 ngModel 的表单,并尝试使用 ngModelChange 更新模型中其他属性的值,问题是当用户与控件交互时调用 ngModelChange,但在更新模型时不调用从组件。
让我向您展示一个示例代码。
https://stackblitz.com/edit/angular-ivy-z2q4mr
HTML 模板:
<form #f="ngForm" (ngSubmit)="onSubmit(f)">
<mat-form-field appearance="fill">
<mat-label>Field 1</mat-label>
<input matInput name="field1" [(ngModel)]="MyItem.field1" (ngModelChange)="changeField2($event)">
</mat-form-field>
<mat-form-field appearance="fill">
<mat-label>Field 2</mat-label>
<input matInput disabled name="field2" [(ngModel)]="MyItem.field2" (ngModelChange)="changeField3($event)">
</mat-form-field>
<mat-form-field appearance="fill">
<mat-label>Field 3</mat-label>
<input matInput disabled name="field3" [(ngModel)]="MyItem.field3">
</mat-form-field>
</form>
零件
import { OnInit, Component, ViewChild } from '@angular/core';
@Component({
selector: 'app-component1',
templateUrl: './component1.component.html',
styleUrls: ['./component1.component.css']
})
export class Component1Component implements OnInit {
MyItem : any = {}
constructor() {
}
ngOnInit(): void {
}
changeField2(event: any){
this.MyItem.field2 = this.MyItem.field1 + " modification field 2"; //We can see that everytime field1 is changed is updating field2
}
changeField3(event: any) {
this.MyItem.field3 = this.MyItem.field2 + " modification field 3"; //Eventhough we are updating field2, this is not being called
}
}
如果我更改了 field1(因为它与 field2 相关),我希望 field3 会自动更新。当然我也考虑过调用changeField3
on changeField2
,但是如果我有一个有很多控制器的表单,那就太混乱了,可以从不同的方法调用相同的操作。
解决方案
Field3
不会更新,因为您没有在Field2
.
(ngModelChange) 是 ngModel 指令的 @Output。它在模型更改时触发。
为了使您的示例正常工作,您必须在第一个字段更改时将第三个字段与第二个字段一起更改
changeField2(event: any) {
this.MyItem.field2 = this.MyItem.field1 + ' modification field 2';
this.MyItem.field3 = this.MyItem.field2 + ' modification field 3';
}
实现您想要的另一种方法是使用ReactiveForms
Playground
推荐阅读
- image-processing - 如何将 DCT 块转换回颜色值?
- python-3.x - 默认执行器 asyncio
- osgi - Apache Karaf/Fuse 与 Keycloak 的集成
- python - 将图像上传到 Google Cloud 而不是保存到磁盘 (Python)
- r - 部分字符串匹配的模糊连接
- windows - 为什么sh.exe会吞下`\`以及如何转义`\`?
- ssl - 在没有证书管理器的情况下在 Ingress 中使用 ssl
- android - SendTextMessage 不发送短信
- openshift - 如何为 openshift 实现 sso
- r - 如何在交叉验证中解决“FUN(X[[i]], ...) 中的错误:仅在具有所有数值变量的数据帧上定义”