【发布时间】:2017-10-08 01:07:30
【问题描述】:
我在使用 Angular 中的模板表单进行条件验证时遇到问题。我创建了一个自定义 EmailInputComponent:
<div class="form-group" provide-parent-form>
<label for="email">Email<span *ngIf="required">*</span></label>
<input id="email"
class="form-control"
name="email"
type="email"
[(ngModel)]="emailAddress"
#email="ngModel"
maxlength="255"
validateEmail
[required]="required ? '' : null"/>
<error [model]="email" [referencedValue]="emailAddress"></error>
</div>
托管在父级 MyFormComponent 中:
<form #form="ngForm" name="form" (ngSubmit)="onSubmit($event)">
<fieldset>
<email [(emailAddress)]="model.email" [required]="emailRequired()"></email>
<!-- select component here -->
</fieldset>
<button type="submit" [disabled]="!form.form.valid">Send</button>
</form>
该表单还包含一个 SelectComponent,用户可以在其中选择他们喜欢的联系方式。如果用户选择“email”,则必须输入email。
如您所见,父母 emailRequired 中存在一些逻辑 根据当前选择的首选联系方式动态计算电子邮件输入是否是强制性的功能。 每当这个选定的值发生变化时,我都需要以某种方式触发电子邮件输入验证器。我怎样才能做到这一点?
使用 @ViewChild 我设法从 MyFormComponent 中获得了 EmailInputComponent。但我现在不知道如何进行......
【问题讨论】:
-
您是否尝试过使用AbstractControl#updateValueAndValidity?由于您将
required用作@Input,因此您可能希望将其添加到子组件的ngOnChanges生命周期挂钩中。 -
这与您的问题无关,但我建议您考虑使用反应形式,这样会更容易处理。只是一个善意的建议:)
-
您的
EmailInputComponent是否实现了ControlValueAccessor?更多详情请见this answer -
@GarthMason:不,我使用了github.com/angular/angular/issues/9600#issuecomment-317774127的解决方法
-
@AJT_82 我不喜欢反应形式附带的所有样板 TS 代码。这就是为什么我要坚持使用模板驱动的。
标签: javascript angular validation angular2-forms