【发布时间】:2019-04-23 02:58:07
【问题描述】:
我有一个包含输入和材料组件(如mat-select或mat-checkbox)的表单。
每次用户进行修改时,我都想将它们保存到数据库中。所以我做了类似<form (change)="save()">的事情。
这对于本机输入来说完美无缺,但是当用户更改材质组件值时它不会触发。
我宁愿避免在每个组件上使用<mat-select (selectionChange)="save()"> 之类的解决方案,因为当我必须更新我的表单时很容易忘记添加它。
编辑
这是一个模板驱动的表单。我的模板如下:
<form (change)="save()">
<!-- Will trigger save -->
<mat-form-field class="col">
<input matInput placeholder="Name" name="name" [(ngModel)]="item.name">
</mat-form-field>
<!-- Will NOT trigger save -->
<mat-form-field class="col">
<mat-select placeholder="Category" name="category [(ngModel)]="item.category.id">
<mat-option *ngFor="let category of categories" [value]="category.id">{{category.name}}</mat-option>
</mat-select>
</mat-form-field>
<!-- ... -->
</form>
组件代码没有什么特别的,只有模型变量(item: Item;)。
【问题讨论】:
-
你能显示你的组件代码吗?例如。你在使用响应式/模板驱动的表单吗?
-
@DaniilAndreyevichBaunov,我更新了我的问题。
-
如果不需要模板驱动的表单,那么您可以考虑转换为响应式表单。这将允许您在 component.ts 代码中订阅表单本身的更改事件,而不是在 HTML 中使用一堆事件处理程序。如果您有兴趣,这里是文档的链接Reactive Forms - valueChanges
-
我并没有真正看到使用响应式表单的优势,因为在我看来代码重复(因为我的模型对象已经存在)和 SoC 中的漏洞(因为背后的代码不应该注意模板上的内容)。我真的不明白这个问题,例如,mat-select 有一个双向绑定
[()],因此应该触发 change 事件,对吧?
标签: angular forms angular-material onchange