2017-02-27 62 views
0

所以我有一个自定义的异步验证,像这样:去抖输入发送重复的值

import { Injectable } from '@angular/core'; 
    import { FormControl } from "@angular/forms"; 
    import { DefaultApi } from "../data/api/DefaultApi"; 
    import { Observable } from 'rxjs/Rx'; 
    import 'rxjs/Rx'; 

    @Injectable() 
    export class ValidationService { 

    tempURL = "http://localhost/api/v1/validate"; 

    oldVal: any; 

    constructor(private defaultApi: DefaultApi) { 
    } 

    generateValidator(validationType: string) { 
     return (control: FormControl) => { 
     return new Observable((obs: any) => { 
      control 
      .valueChanges 
      .debounceTime(400) 
      .mergeMap(value => { 
       return this.defaultApi.validationGet(validationType, value) 
      }) 
      .subscribe(
       data => { 
       obs.next(null); 
       obs.complete(); 
       }, 
       error => { 
       obs.next({'validationFailed': true}); 
       obs.complete(); 
       } 
      ); 
     }).distinctUntilChanged(); 


     } 

    } 
    } 

的问题是,虽然它是“分组”的按键正确(即有人类型913会发出913没有9 1 3 )它会多次发射它们(913,913,913)。我尝试过移动独特的UnicantChanged,但无济于事。我错过了明显的东西吗?

回答

0

尝试.throttleTime(400)而不是.debounceTime(400)

+0

这摆脱了重复的请求,但它似乎不会增加任何延迟。这是为了验证输入字段,所以我想等到用户在打到服务器之前停止输入一点点。 – fridder

+0

在启动observable之前,您可能需要设置一个超时时间,但去抖动将始终具有与刚刚输出的输出相同的输入(例如某些类型为1-2-3,它将发射3次),其中限制或限制输出。 –