2017-06-10 133 views
0

我想在我的應用程序的列表上進行自動完成搜索。 搜索工作得很好,但當頁面加載時,我無法顯示列表的所有值。自動完成搜索默認值

例如,當我到達我的搜索頁面時,我希望顯示列表的內容,並且在執行搜索時我希望過濾值。 該過濾器完美地工作,但「默認顯示」似乎不工作。

下面是代碼:

itemList: Observable<Item[]>; //List displayed on the view 
term = new FormControl(); 
    ngOnInit() { 
     //A search is done when the user type something in the search bar 
     //then load on the list 
     this.itemList = this.term.valueChanges 
      .debounceTime(400) 
      .distinctUntilChanged() 
      .switchMap(term => this.searchItem(term)); 
    } 

    /** 
    * Search of an item by a value. 
    * If there is no value to search, load all item 
    */ 
    searchItem(valueToSearch:string){ 
     var result; 
     var userItemId; 
     if(Meteor.user() !== undefined) { 
      userItemId = Meteor.user().profile.ItemIds; 
     } 
     if(valueToSearch == ''){ 
       result = Items.find({'_id': {$nin: userItemId}}); 
     } 
     else { 
      var regexSearch = new RegExp(valueToSearch.toLowerCase(), "i"); 
      result = Items.find({'title': regexSearch, '_id': {$nin: userItemId}}); 
     } 
     return result; 
    } 

基本上,我似乎無法使那部分工作時的頁面加載:

...   
if(valueToSearch == ''){ 
       result = Items.find({'_id': {$nin: userItemId}}); 
     } 
... 

也許這是一個「訂閱」的問題,我對功能不是很熟悉。

+0

searchItem()應該返回一個可觀察 – Skeptor

+0

謝謝你的答案,但我不明白這一點,會是什麼變化的時候,頁面加載?我的意思是,當我做研究時,它工作正常。你能否多解釋一下:) –

+0

switchmap函數需要一個參數並返回一個流。如果我執行同樣的任務,我會寫一個答案。 – Skeptor

回答

0

您可以創建一個Observable並將其返回。如果流星返回承諾,你可以直接創建Observable.fromPromise() 希望它有幫助。

searchItem(valueToSearch:string): Observable<Item[]>{ 
    return Observable.create((observer)=>{ 
     let userItemId = Meteor.user() 
       && Meteor.user() 
       && Meteor.user().profile 
       && Meteor.user().profile.ItemIds; 
    if(!userItemId){ 
     observer.error(''); 
    } 
    if(valueToSearch == ''){ 
     observer.next(Items.find({'_id': {$nin: userItemId}})); 
    }else { 
     var regexSearch = new RegExp(valueToSearch.toLowerCase(), "i"); 
     observer.next(Items.find({'title': regexSearch,'_id': {$nin: userItemId}})); 
    } 

});