2017-02-27 63 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次),其中限制或限制輸出。 –