带debounceTime和onFocusOut的angular 2搜索输入

带debounceTime和onFocusOut的angular 2搜索输入,angular,rxjs,angular2-forms,Angular,Rxjs,Angular2 Forms,我的搜索输入有问题。在Angular 2项目中,我有搜索输入: <input [(ngModel)]="data.value" (keyup)="input$.next($event)" (focusout)="onFocusOut($event)" /> 在我的打字稿上: input$ = new Subject<any>(); ngOnInit() { this.input$ .do(this.keyUpEventHandler.bind(this

我的搜索输入有问题。在Angular 2项目中,我有搜索输入:

 <input [(ngModel)]="data.value" (keyup)="input$.next($event)" (focusout)="onFocusOut($event)" />

在我的打字稿上:

input$ = new Subject<any>();
ngOnInit() {
  this.input$
    .do(this.keyUpEventHandler.bind(this))
    .debounceTime(3000)
    .distinctUntilChanged()
    .subscribe((value) => {
      console.log('afterDebounce', value);
// do http request in service
        });
  }

  onFocusOut(event) {
    //this.input$.skipLast(1);
   // do http request in service immediately 
  }
input$=新主题();
恩戈尼尼特(){
这是输入$
.do(this.keyUpEventHandler.bind(this))
.debounceTime(3000)
.distinctUntilChanged()
.订阅((值)=>{
console.log('afterDebounce',值);
//在服务中执行http请求
});
}
onFocusOut(事件){
//此.input$.skipLast(1);
//立即在服务中执行http请求
}
我的问题是当我打字的时候。。。然后单击enter,我的输入组件就失去了焦点,我调用了http请求,但3秒钟后又再次调用。是否有任何解决方案可以忽略输入$observed的最后一个

我不喜欢取消订阅整个observable,因为我希望以后使用它(如果用户想要搜索数据)
谢谢

您可以创建两个数据流,一个用于“keyUp”事件,另一个用于“blur”事件。比使用一点RxJs魔法,请执行以下操作:

@ViewChild('searchValueInput') searchValueInput: any;

constructor(private http: HttpClient) {
      }

ngAfterViewInit() {
    this.subscribeToInputChanges();
    }

subscribeToInputChanges(){
  let keyUp$:Observable<any>=Observable.fromEvent     
  (this.searchValueInput.nativeElement, 'keyup')
    .debounceTime(3000)
    .distinctUntilChanged();

let focusOut$:Observable<any>=Observable
.fromEvent(this.searchValueInput.nativeElement, 'blur');

  Observable.defer(()=>Observable.race(
    keyUp$,
    focusOut$
  ))
  .take(1)
  .repeat()
  .subscribe(res=>{
    this.http.get('someURL')
    .subscribe(response=>{
      //Handle response
    })
  })
}
@ViewChild('searchValueInput')searchValueInput:any;
构造函数(专用http:HttpClient){
}
ngAfterViewInit(){
this.subscribeToInputChanges();
}
subscribeToInputChanges(){
let keyUp$:Observable witch告诉被观察者使用发射的第一个被观察者

我们还将此“竞争”可观察项包装在另一个可观察项中。延迟可观察项与和负责保持订阅活动,并且不总是使用相同的可观察项(keyUp$或focusOut$)


Iv'e制作了一个小节目,上面的所有内容都在一个工作示例中。

非常感谢!你让我开心了:)
  <input #searchValueInput type="text" class="search" placeholder="Search">