我试图使用角度材质的md-autocomplete,我有指定的指令,如
<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
答案 0 :(得分:4)
搜索函数实际上返回undefined,所以只需将其包装在一个promise中。
我简化了函数并将angular的$ filter用作Search-Service。
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'
答案 1 :(得分:0)
如果仍然出现此错误,请尝试更新角度材料,否则错误将会消失。 (我将我的一个更新为0.9.8)