【发布时间】:2017-06-18 14:48:12
【问题描述】:
我已经为 Angular2 Forms 编写了一个自定义验证器。 它只是将输入与黑名单进行比较,到目前为止效果很好。 有一个例外:如果在表单验证完成后更新了黑名单,则在输入字段更改之前不会再次验证表单。 为了解决这个问题,我在组件中获取模板变量并手动触发更新。
@ViewChild('email') emailNgModel: NgModel;
...
this.emailBlacklist = this.emailBlacklist.concat(email);
let sub = this.zone.onStable.asObservable().subscribe(() => {
if (sub) sub.unsubscribe();
this.zone.run(() => {
this.emailNgModel.control.updateValueAndValidity();
});
});
我更愿意听取指令中的更改并从那里触发更新(请参阅下面的 TODO)
export const BLACKLIST_VALIDATOR: any = {
provide: NG_VALIDATORS,
useExisting: forwardRef(() => BlacklistValidatorDirective),
multi: true
};
@Directive({
selector: '[validateBlacklist][formControlName],[validateBlacklist][formControl],[validateBlacklist][ngModel]',
providers: [BLACKLIST_VALIDATOR]
})
export class BlacklistValidatorDirective implements Validator, OnChanges {
@Input('validateBlacklist') blacklist;
constructor() {
}
ngOnChanges(changes: SimpleChanges): void {
if ('blacklist' in changes) {
// TODO trigger ngModel.control.updateValueAndValidity()
}
}
validate(c: AbstractControl): {[p: string]: any} {
return validateBlacklist(this.blacklist, c.value);
}
}
export function validateBlacklist(blacklist: string[], value) {
if (blacklist && blacklist.indexOf(value) >= 0) {
return {
blacklist: true
};
}
return null;
}
现在的问题是,如何从主机获取 ngModel?或者我一般如何在同一主机上获取其他指令?
【问题讨论】:
标签: angular angular2-forms angular2-directives