angular - 使用模型重置 Angular 表单
问题描述
我希望能够使用其模型的一些默认值重置 Angular 表单
<form>
<input type="text" name="text" [(ngModel)]="model.text">
<button type="reset" (click)="resetModel()">Reset</button>
</form>
并在组件中
model = { text: 'Test' };
resetModel() {
this.model = { text: 'Test' };
}
这不起作用,因为在设置模型并且文本通过重置设置为空之后发生重置。
我能想到的唯一两件事是使用超时,就像我们曾经用类似的方式污染我们的 AngularJs 应用程序一样
resetModel() {
setTimeout(() => { this.model = { text: 'Test' }; });
}
https://stackblitz.com/edit/angular-5pdpml
或者使按钮成为普通的旧按钮而不是重置按钮,并将表单传递给重置方法并调用 markAsUntouched 和 markAsPristine。
我真的不喜欢这两个选项中的任何一个。
我尝试为输入提供一个值,以便重置具有默认值,但 Angular 仍将模型设置为 null,即使输入确实具有重置设置的文本。
有没有办法让重置按钮设置默认表单状态而不是将所有绑定设置为空?
解决方案
有一种方法不使用setTimeout
. 您可以获取表单的引用并调用其中一个reset
或多个resetForm
方法(在这种情况下两者都可以)来重置值(和状态)。
<form #myForm="ngForm">
<input type="text" name="text" [(ngModel)]="model.text">
<button type="button" (click)="myForm.reset({ text: 'Test' })">Reset</button>
<!-- <button type="button" (click)="myForm.resetForm({ text: 'Test' })">Reset</button> -->
</form>
{{ model | json }}
这是更新的stackblitz。
您应该注意到按钮不是 typereset
而是 regular button
,由于某种原因 typereset
不起作用。我将进行更多研究,并希望找到原因...
编辑:显然,当使用按钮时,type=reset
它会自动将表单值重置为其默认值(如果input
控件将是value
属性中定义的值)。这在 Angular 表单上下文中似乎是不正确的,不应该使用(关于这里的更多信息)。
此外,甚至不建议reset
在表单中使用按钮(根据官方文档),因此我非常有信心type=button
在这种情况下使用它是正确的。
您通常应该避免在表单中包含重置按钮。它们很少有用,反而更有可能让误点击它们的用户感到沮丧(通常是在尝试点击提交按钮时)。
reset
最后,我会提到和之间的区别resetForm
。它们是相同的,除了resetForm
也会影响submitted
表单的状态(将其设置为false
)。更多关于这里。
推荐阅读
- angular - nouislider with angular2 - set 不是一个函数
- mysql - 根据条件过滤 SQL 表
- javascript - 从静态文件夹获取图像文件并在客户端应用程序中显示它们
- xcode - xcode 10 调试器在某些断点上停止,而在其他一些断点上停止
- r - “模型”对象在 R Keras 多 GPU 模型中没有属性“predict_classes”
- javascript - 我想将文件发送到 api url 并获得响应而不使用 ajax 重定向到它
- php - Laravel 5.7 - 使用 morphMany 关系和自定义属性获取器的渴望加载
- reactjs - 反应钩子渲染额外的时间
- python - 张量流移位图像和插值
- javascript - intersectionObserver - I would my slide stop to move when an option box reaches one of boundary-side of the container