自动完成搜索默认值

时间:2017-06-10 15:15:17

标签: javascript angular meteor

我正在尝试在我的应用程序列表上进行自动完成搜索。 搜索工作得很好,但是在加载页面时我无法显示列表的所有值。

例如,当我到达我的搜索页面时,我希望显示列表中的内容,当我正在进行搜索时,我希望过滤值。 过滤器工作正常,但“默认显示”似乎不起作用。

以下是代码:

 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}});
        }
...

也许这是一个“订阅”问题,我对这个功能并不是很熟悉。

1 个答案:

答案 0 :(得分:0)

您可以创建一个Observable并将其返回。如果Meteor返回promise,你可以直接创建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}}));
    }

});