2015-03-09 4 views
2

Я пытался использовать MD-автозаполнения угловых материала, я директива указан какмкр-автозаполнение не работает

<md-autocomplete 
    md-selected-item="mainctrl.selectedItem" 
    md-search-text="mainctrl.search_term" 
    md-items="item in mainctrl.search(mainctrl.search_term)" 
    md-item-text="item" 
    md-delay="500" 
    md-min-length="4" 
    placeholder="Type to search"> 
    <span md-highlight-text="mainctrl.search_term">{{item}}</span> 
    </md-autocomplete> 

И в контроллере я определил функцию поиска как

this.search = function(term){ 
    var result = []; 
    Search.findValues(term,this.details.data,result).then(function(res){ 
    console.log(res); 
    return res; 
    }); 
}; 

служба поиска является, как указано ниже:

.service('Search',function($q){ 
    var self = this; 
    var deferred; 

    self.findValues = function(term,obj,result){ 

    //if(!deferred){ 
    deferred = $q.defer(); 
    //} 
    if(typeof obj === 'object'){ 
    angular.forEach(obj,function(v,k){ 
     self.findValues(term,v,result) 
    }); 
    deferred.resolve(result); 
    } else{ 

    if(typeof obj!='number'&& typeof obj!='boolean'){ 
     var res = obj.search(term); 
     if(res!=-1){ 
     result.push(obj); 
     } 
    } 
    } 
    return deferred.promise; 
} ; 
return self ; 

});

Я получаю желаемый результат, но по какой-то причине, я получаю эту ошибку при слежении,

TypeError: Cannot read property 'length' of undefined 
at g (angular-material.min.js:271) 
at r (angular-material.min.js:271) 
at processQueue (angular.js:13189) 
at angular.js:13205 
at Scope.$get.Scope.$eval (angular.js:14401) 
at Scope.$get.Scope.$digest (angular.js:14217) 
at Scope.$get.Scope.$apply (angular.js:14506) 
at angular.js:16232 
at completeOutstandingRequest (angular.js:4905) 
at angular.js:5285 

ответ

3

Функция поиска фактически возвращает неопределенное значение, так просто обернуть его в обещании.

Я упростил функции и использовал угловой фильтр $ в качестве поисковой службы.

search (term) { 
    var q = this.$q.defer(); 
    this.findValues(term, this.data).then(function (res) { 
    q.resolve(res); 
    }); 
    return q.promise; 
} 

findValues (term, obj) { 
    var deferred = this.$q.defer(); 
    deferred.resolve(this.$filter('filter')(obj, term)); 
    return deferred.promise; 
} 

Я нашел эту статью на обещания очень полезную: http://www.html5rocks.com/en/tutorials/es6/promises

Вы также можете захотеть взглянуть на ваш поиск-услуги, как ваше обещание никогда не разрешает или отвергает, если obj ==='undefined'

0

Если вы еще получите эту ошибку, попробуйте обновить свой угловой материал, и это будет ошибкой. (Я обновил мин до 0,9,8)

Смежные вопросы