我在使用控件和选择框构建动态angular2表单时遇到问题,例如plunker:
<select class="form-control" ngControl="power">
<option *ngFor="#p of powers" [value]="p">{{p}}</option>
</select>
您可以选择英雄力量,控件将具有相同的值 . 但是如果按 Change Powers
,则所选值将为null,但控制值仍为旧值 . 这是一个严重的问题,我认为这是一个很多错误的来源,当表单显示一件事但实际上它会提交一些不同的东西,有没有办法更新控件的内容?有 updateValue()
但您必须在所有这些情况下手动设置值 .
在表单构建之后更新selectbox选项时也会出现类似的情况,它会在selectedbox中显示一个选定的值,而控件值将为null,有关如何处理此问题的任何想法?
6 回答
在Angular 2 Final(RC5)中,有用于更新表单值的新API .
patchValue()
API方法支持部分表单更新,我们只需要指定一些字段:还有
setValue()
API方法需要具有所有表单字段的对象 . 如果缺少某个字段,我们将收到错误消息 .更新
截至最新的angular2语法更新将是这样的
目前这是你唯一可以做的事情(如问题中所述)
有一个未解决的问题,允许重置表单https://github.com/angular/angular/issues/4933
还有一个拉取请求,但也允许你为每个控件"manually",但也允许重置状态,如原始,触摸,... https://github.com/angular/angular/pull/6679
[Angular 2稳定]
这是一种只使用NgModel的脏方法(并且不导入其他表单构建器或表单组模块)
你可以尝试保持形式不变 . 当您需要重置它时,您只需重建它 . 这种方式可以确定它是最新的 . 您还可以将值保存在某处并将表单重置为这些值 . 假设您正在编辑项目,重置后可以恢复为原始值,而不仅仅是空表格...
我用
@ngrx/store
创建了处理这种功能的基本表单,这里是the Gist . 当我需要一个不同模型的表单时,我将扩展BaseForm
并只定义controls
和submit()
方法,其余的继承...代码是: