首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角度2事件监听器条件竞速

角度2事件监听器条件竞速
EN

Stack Overflow用户
提问于 2017-11-03 15:32:26
回答 4查看 1K关注 0票数 1

我有一个指令appValidateOnChange,它实现了

代码语言:javascript
复制
@HostListener('focus') onFocus() {
    this.validators = this.formControl.control.validator;
    this.asyncValidators = this.formControl.control.asyncValidator;
    this.formControl.control.clearAsyncValidators();
    this.formControl.control.clearValidators();
}
@HostListener('change') onChange() {
    this.formControl.control.setAsyncValidators(this.asyncValidators);
    this.formControl.control.setValidators(this.validators);
    this.formControl.control.updateValueAndValidity();
}

目标是等待用户完成输入,然后再进行验证。我简单地这么叫它

代码语言:javascript
复制
<input
        type="text"
        class="form-control"
        id="field"
        name="field"
        [ngModel]="fieldValue"
        #fieldName="ngModel"
        required
        minlength="8"
        (change)="updateField(fieldName)"
        appValidateOnChange>

updateField函数中,我有

代码语言:javascript
复制
if(!field.valid)
    return false;

问题是,两个change事件之间存在竞争条件。

有时一切都按预期进行,因为指令的事件首先触发,而有时验证被忽略,因为指令的事件是第二个触发的。

我该如何解决这个问题呢?我想避免使用setTimeout

EN

回答 4

Stack Overflow用户

发布于 2017-11-06 02:02:11

如果您已升级到Angular 5,则添加了一个仅在blur上验证的新功能,例如:

代码语言:javascript
复制
<input name="firstName" ngModel [ngModelOptions]="{updateOn: 'blur'}">

我建议您查看标题Angular Forms adds updateOn / Submit下的文档

https://blog.angular.io/version-5-0-0-of-angular-now-available-37e414935ced

票数 2
EN

Stack Overflow用户

发布于 2017-11-06 01:17:18

我只是不会在控件具有焦点时显示验证结果,而完全忽略发生默认验证时的结果。

使用focus和blur事件设置/清除标志,并在设置标志时隐藏验证警告(使用*ngIf[hidden]="myFlag"

票数 1
EN

Stack Overflow用户

发布于 2017-11-07 06:49:58

我认为如果你使用ngModelChange而不是change,就像你使用ngModel一样,那么指令总是首先触发的:

HTML

代码语言:javascript
复制
<input myDirective
        type="text"
        class="form-control"
        id="field"
        name="field"
        [ngModel]="fieldValue"
        #fieldName="ngModel"
        required
        minlength="8"
        (ngModelChange)="updateField(fieldName)"
        appValidateOnChange>

指令

代码语言:javascript
复制
@HostListener('ngModelChange') onChange() {
  console.log("onChange fired")
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47090594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档