【问题标题】:How do i debounce form in angular2我如何在 angular2 中去抖动表单
【发布时间】:2017-01-22 10:53:25
【问题描述】:

我浏览了很多帖子,但没有找到我想要的。

基本上,

我正在显示用户对表单更改的验证。我的模板如下所示:

<div class="form-group"
      [class.error]="!loginForm.find('email').valid && loginForm.find('email').touched">
        <div class="input-wrapper">
          <input type ="email"
              class="form-control"
              id="email-input"
              placeholder="Email"
              formControlName="email">
        </div>  
        <div *ngIf="loginForm.controls['email'].dirty && !loginForm.controls['email'].valid"
          class="alert-msg">Email is invalid</div>
</div>

而且,看看其他帖子,我的去抖动表单的 TS 是这样的:

this.loginForm.valueChanges.debounceTime(500).subscribe(form => {
  console.log(form, this.loginForm);
});

现在,控制台日志实际上正在去抖动。但是,验证消息不会去抖动。它会立即显示消息。

有没有办法解决这个问题?

感谢您的光临,

【问题讨论】:

    标签: javascript angular observable angular2-forms


    【解决方案1】:

    我相信 debounceTime 只会影响您在响应 form =&gt; { ... } 中的代码。 所以你可以做的是在那里设置验证:

    private loginFormIsValid:boolean;
    private emailIsNotValid:boolean;
    
    ngOnInit() {
        this.loginForm.valueChanges.debounceTime(500).subscribe(form => {
            this.loginFormIsValid = !loginForm.find('email').valid 
                && loginForm.find('email').touched;
            this.emailIsNotValid = loginForm.controls['email'].dirty 
                && !loginForm.controls['email'].valid;
            console.log(form, this.loginForm);
        });
    }
    

    ...然后您将在模板中使用它,如下所示:

    <div class="form-group" [class.error]="!loginFormIsValid">
        <div class="input-wrapper">
          <input type ="email"
              class="form-control"
              id="email-input"
              placeholder="Email"
              formControlName="email">
        </div>  
        <div *ngIf="emailIsNotValid"
          class="alert-msg">Email is invalid</div>
    </div>
    

    你可以看看post on debouncing,这是一个很好的例子。

    【讨论】:

    • 是的,我最终这样做了。
    • 我们可以在控制级别添加debounceTime(500) 吗?因为this.loginForm.valueChanges.debounceTime(500) 在表单级别?
    • 是的,valueChanges 也可以在 FormControl 上找到,它会返回一个带有 debounce()Observable
    • @TouqeerShafi 你有没有为此想出一个好的解决方案?我假设您只希望对某些控件进行去抖动(例如,文本字段而不是单选按钮)
    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2017-07-01
    • 1970-01-01
    • 2022-06-16
    相关资源
    最近更新 更多