Angular 2 Form Async validation ajax call on every keypress

回眸只為那壹抹淺笑 提交于 2019-12-11 01:58:11

问题


I am playing with angular 2 forms async validation, everything is working fine but then i realised ajax call is made to server on every key press inside input field which is not good for server, i tried many things but nothing works. So please help me to how to deal with this problem.

form: FormGroup;
username: FormControl;
password: FormControl;

constructor(private fb: FormBuilder, private http: Http) {
    this.username = new FormControl("", Validators.compose([
        Validators.required, 
        SignupValidators.CannotContainSpace]),
        this.usernameShouldBeUnique.bind(this));

    this.password = new FormControl("", Validators.compose([Validators.required]));

    this.form = fb.group({
        username: this.username,
        password: this.password
    });
}

Async validation Method:

usernameShouldBeUnique(formControl:FormControl) {

    return new Promise(resolve => {

        let params = new URLSearchParams();
        params.set('username', formControl.value);
        this.http.get('http://localhost:1667/api/users/signup/namecheck', { search: params })
                  .subscribe(data => resolve(null), 
                             error => resolve({ usernameShouldBeUnique: true })
                            );
    });
}

回答1:


Per this fine answer, you can use the surprisingly-handy setTimeout and clearTimeout to delay your requests:

private timeout;

usernameShouldBeUnique(formControl: FormControl) {
  MY_DELAY = 500;
  clearTimeout(this.timeout);
  return new Promise(resolve => {
    let params = new URLSearchParams();
    params.set('username', formControl.value);
    this.timeout = setTimeout(() => {
      this.http.get('http://localhost:1667/api/users/signup/namecheck', {
          search: params
        })
        .subscribe(data => resolve(null),
          error => resolve({
            usernameShouldBeUnique: true
          })
        );
    }, MY_DELAY);
  });
}

MY_DELAY will cause the request to wait 500 milliseconds for no more validation changes before proceeding.




回答2:


You can play with Rxjs operators called debounceTime or delay and distinctUntilchanged as shown below,

usernameShouldBeUnique(formControl:FormControl) {



        let params = new URLSearchParams();
        params.set('username', formControl.value);

     return this.http.get('http://localhost:1667/api/users/signup/namecheck', { search: params })

     // .delay(300)                  <---- check this according to your need
        .debounceTime(300)         //<---- wait for 300ms pause in events
        .distinctUntilChanged()    //<---- ignore if next search term is same as previous


        .subscribe(data => resolve(null), 
                             error => resolve({ usernameShouldBeUnique: true })
                            );



}


来源:https://stackoverflow.com/questions/38801960/angular-2-form-async-validation-ajax-call-on-every-keypress

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!