2017-02-20 40 views
1

我有一個簡單的可編輯的div:角2自動提示可編輯的股利和RxJS

<div #editable editable=true (keypress)='seach(editable.innerText)'></div> 

在我的組件類我有搜索方法:

.... 
.... 
search(event: any) { 
Observable.from(event) 
    .debounceTime(200) 
    .distinctUntilChanged() 
    .switchMap((query: any) => this.myService.searchUser(query)) 
    .subscribe((response: any) => {this.results = response.data;     }); 

} 

的問題是,搜索查詢只用一個字母來執行。如何保持我的流的以前的值?例如,如果我搜索「家」中,SEACH方法將執行「H」然後「O」,那麼「U」 ...等

+0

又有什麼問題呢?這就是爲什麼你有'debounceTime()'來避免太頻繁地集中服務器。或者你想保留以前的所有迴應? – martin

+0

這是一個搜索功能,所以debouceTime()是爲了避免過於頻繁地使用,問題是我想保留以前的錄音信件,以便搜索完整的單詞。 –

+1

所以你只收到用戶在'query'中按下的單個字母。我不確定'.innerText'是否會返回'editable = true'組件,所以你可以使用'.textContent'來代替? – martin

回答

1

你可以做這樣的:

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <h2>Hello {{name}}</h2> 
     <div #editable contenteditable=true (keyup)='search(editable.innerText)'>test</div> 
     <div #editable contenteditable=true (keyup)='_searchSubject.next(editable.innerText)'>inline without search function</div> 
    </div> 
    `, 
}) 
export class App { 
    name:string; 
    constructor() { 
    this.name = 'Angular2' 
    } 

    private results; 
    private _searchSubject = new BehaviorSubject<string>(''); 

    ngOnInit() { 
    this._searchSubject 
     .debounceTime(200) 
     .distinctUntilChanged() 
     .subscribe(input => console.log(input)); 
     // dont want to fake it.. :) 
     //.switchMap((query: any) => this.myService.searchUser(query)) 
     //.subscribe((response: any) => { 
     // this.results = response.data; 
     //}); 
    } 

    search(val: any) { 
    console.log('search', val); 
    this._searchSubject.next(val); 
    } 
} 
  • 使用(keyup)代替(keypress) =>否則你不會得到最後的關鍵
  • 使用一個全球性的主題訂閱和搜索功能使用next

工作演示:https://plnkr.co/edit/xYkU0QGZnsSaa38EQcDd?p=preview

UPDATE

要過濾 「空」 的投入,像這樣做:

ngOnInit() { 
    this._searchSubject 
     .debounceTime(200) 
     .distinctUntilChanged() 
     .filter(input => input) // BUT can lead to weird behaviors???! 
     .subscribe(input => console.log('"' + input + '"')); 
     // dont want to fake it.. :) 
     //.switchMap((query: any) => this.myService.searchUser(query)) 
     //.subscribe((response: any) => { 
     // this.results = response.data; 
     //}); 
} 
+0

您的示例工作,但如果我添加其餘的代碼,它不再工作,看起來像第二個訂閱(或switchMap)沒有抓住價值! –

+0

你需要刪除「我的」訂閱,如果你取消註釋你的代碼!在這個鏈中只能有一個訂閱! :) – mxii

+0

你可以改變我的訂閱到一個'do()'來查看輸出。 – mxii