我正在使用Angular 4.1.3并遇到了这个要求,并希望与我分享我的解决方案。不幸的是,www.angular.io上的文档并未真正列出系统组件上的所有可用道具和方法,例如ngForm元素(或者至少我找不到它)。
我的要求是我需要一个<input>
元素,该元素是<form>
的一部分,仅在模糊事件之后才更新其绑定的值。显然,只有在没有使用 [ngModel] 的情况下才能实现这一点:
<form #f="ngForm">
<input (change)="myVar = $event.target.value" [value]="myVar" />
<span *ngIf="f.dirty">Form is Dirty!</span>
</form>
但由于此输入未绑定到 ngModel Angular不知道它是表单的一部分。因此,当值更改时,表单不会标记为脏。
答案 0 :(得分:3)
要解决此问题,您需要手动将表单设置为脏,并且可以在 ngForm 对象上使用 markAsDirty()方法,如下所示:
<form #f="ngForm">
<input (change)="myVar = $event.target.value; f.form.markAsDirty();" [value]="myVar" />
<span *ngIf="f.dirty">Form is Dirty!</span>
</form>
答案 1 :(得分:0)
您需要使用name
属性和ngModel
注册表单控件。现在,每个控件都标记了(唯一的)name
值和ngModel
,这意味着它现在已注册为表单控件。
此外,您需要通过将ngModel
导出到本地模板变量来检查控件状态,例如#someRef="ngModel"
。现在我们也可以对这个表单控件进行验证,同时,由于Angular遵循此控件的状态,Angular可以看到表单是脏的(除其他外)。
例如,使用上面我们可以有一个(剥离的)形式:
<form #f="ngForm">
<label>Username</label>
<input name="username" ngModel #userName="ngModel">
</form>
<span *ngIf="f.dirty">Form is Dirty!</span>