Angular 2:在valueChanges之后更新FormControl验证器
Angular 2: Update FormControl validator after valueChanges
是否有办法更新一个FormControl对象的Validtors
?我有FormGroup
,其中一个输入是一个选择字段,当选择字段的值发生变化时,我希望我的FormGroup中的另一个FormControl改变验证器。
subscribeToFormChanges()
方法从我的FormGroup组件:
private appIdRegexes = {
ios: /^[a-zA-Z][a-zA-Z0-9]*('.[a-zA-Z0-9'-]+){2,}$/,
android: /^([a-zA-Z])[a-zA-Z0-9_]*('.[a-zA-Z][a-zA-Z0-9'-]*){2,}$/,
any: /^any$/
};
private subscribeToFormChanges(): void {
const myFormValueChanges$ = this.appsForm.valueChanges;
myFormValueChanges$.subscribe(x => {
const platform = this.appsForm.controls['platform'].value;
const appId = this.appsForm.controls['appId'].value;
if (this.appIdRegexes[platform]) {
this.appsForm.controls['appId'] = new FormControl(appId, Validators.pattern(this.appIdRegexes[platform].source));
}
});
}
这是html模板:
<div class="row" [formGroup]="appsForm">
<div class="form-group col-xs-6">
<label>Platform</label>
<select id="licensePlatform" class="form-control"
formControlName="platform">
<option *ngFor="let platform of licensePlatforms" [value]="platform">
{{platform}}
</option>
</select>
<small [hidden]="appsForm.controls.platform.valid">
Platform is required
</small>
</div>
<div class="form-goup col-xs-6">
<label>App ID</label>
<input type="text" class="form-control" formControlName="appId">
<small [hidden]="appsForm.controls.appId.valid">
Please use the right ID format
</small>
</div>
</div>
当我像这里所示的那样实现subscribeToFormChanges()
方法时,appsForm.controls.appId.value
在写入输入字段时不再更新。初始值正在更新
我通过在我的平台选择字段上收听valueChanges
来解决这个问题,然后我在appId输入字段上使用setValidators()
方法。这篇文章很有用。
这是我的解决方案:
private subscribePlatformChanges() {
const platformCtrl = this.appsForm.controls['platform'];
const changes$ = platformCtrl.valueChanges;
changes$.subscribe(platform => {
this.appsForm.controls['appId'].setValidators([Validators.pattern(this.appIdRegexes[platform].source),
Validators.required]);
this.appsForm.controls['appId'].updateValueAndValidity();
});
}
要重新检查FormGroup
中的控件,您可以使用FormControl
的 updateValueAndValidity
做一些事情。
如果this.appsForm
确实是FormGroup
:
this.appsForm.controls.forEach(control => control.updateValueAndValidity());
您可以从select中触发一个更改事件,如下所示
<select id="licensePlatform" class="form-control"
formControlName="platform" (change)="update($event.target.value)" >
<option selected="selected" disabled="disabled" value="">Select Card Type</option>
<option *ngFor="let platform of licensePlatforms" [value]="platform" >
{{platform}}
</option>
</select>
在组件中,您可以编写如下的更新函数
update(value){
if(value){
(<FormControl>this.appsForm.controls['platform']).setValue(value, {onlySelf: false});
const appId = this.appsForm.controls['appId'].value;
if (this.appIdRegexes[value]) {
this.appsForm.controls['appId'] = new FormControl(appId, Validators.pattern(this.appIdRegexes[value].source));
}
};
}
这将根据您在下拉菜单中所做的选择更新验证器。我相信这会解决你的问题。
相关文章:
- Javascript循环不会自我更新
- 添加文字和评论功能更新Div
- AngularJS:ng之后,重复$scope值未按预期更新
- 如何通过数组更新角度子范围
- Ajax聊天消息重复而不仅仅是更新
- 通过CSV文件上载更新数据库表
- 平均值:无法将数据更新到数据库
- $rootScope未使用forEach进行更新
- d3基于用户选择动态更新节点
- 有条件更新d3.js力图中节点的最佳方法
- Angular:更新一次性绑定的数据
- Javascript更新孙窗口中的表单元素
- 使用AngularJS中的筛选器更新给定的表
- 从选项页面更新chrome扩展清单权限
- 如何在不刷新页面的情况下更新显示框
- 延期承诺值未更新/解析/延期
- 标记的实时更新,无需加载页面谷歌地图API V3
- 使用mongodb更新中的一个变量
- 访问jsrender模板中的全局javascript变量并更新它
- Angular 2:在valueChanges之后更新FormControl验证器