在我的应用程序中,我使用angular.js和jquery ui自动完成。我遇到了与此处讨论的相同问题。那里接受的答案对我非常有用,正是我需要的,直到今天我需要用$http ajax调用替换静态数组值。我尝试将$http作为参数传递给父函数,但是我得到“未知提供者:autoCompleteProvider<-autoComplete”。我的问题是,如何在不重写或更改当前解决方案的情况下使用$http?
app.factory('autoCompleteDataService', ['$http', function($http) {
return {
getSource: function(callback) {
var url = '...';
$http.get(url).success(function(data) {
callback(data);
}
}
}
}]);
如果你的服务器返回JSON格式,你也可以使用$http.jsonp。这时别忘了加上JSON_CALLBACK参数。
在你的指令中,你需要添加回调函数本身:
...
autoCompleteDataService.getSource(function(data) {
elem.autocomplete({
source: data
minLength: 2
});
});
这是你可以做到的方法:
app.factory('autoCompleteDataService', ['$http', function($http) {
return {
getSource: function() {
return function(request, response) {
$http.get(url).success(function(data) {
response(data);
});
}
}
}
}]);
然而,如果您想要先下载整个数据,并允许自动完成小部件在客户端搜索数据,以下是一个示例:
app.directive('autoComplete', function(autoCompleteDataService, $http) {
return {
restrict : 'A',
link : function(scope, elem, attr, ctrl) {
autoCompleteDataService.getData(function(err, data) {
if (err) {
console.log("Could not retrieve data.");
return;
}
elem.autocomplete({
minLength: 0,
source: data,
focus: function( event, ui ) {
elem.val( ui.item.label );
return false;
},
select: function( event, ui ) {
elem.val( ui.item.label );
return false;
}
})
.data( "ui-autocomplete" )._renderItem = function( ul, item ) {
return $( "<li>" )
.append( "<a>" + item.label + "</a>" )
.appendTo( ul );
};
});
}
};
});
app.factory('autoCompleteDataService', ['$http', '$rootScope', function($http, $scope) {
return {
getData: function(callback) {
if ($scope.data) {
return callback(null, $scope.data);
}
$http.get('URL')
.success(function(data) {
$scope.data = data;
return callback(null, data);
})
.error(function(data) {
return callback(true, null);
});
}
}
}]);