我正在尝试编写一个自动完成指令,该指令使用$ http请求(不使用任何外部插件或脚本)从服务器获取数据。目前它仅适用于静态数据。现在,我知道我需要将$ http请求插入到指令的source:
中,但我找不到关于该主题的任何好的文档。
$http.post($scope.url, { "command": "list category() names"}).
success(function(data, status) {
$scope.status = status;
$scope.names = data;
})
.
error(function(data, status) {
$scope.data = data || "Request failed";
$scope.status = status;
});
app.directive('autoComplete', function($timeout) {
return function(scope, iElement, iAttrs) {
iElement.autocomplete({
source: scope[iAttrs.uiItems],
select: function() {
$timeout(function() {
iElement.trigger('input');
}, 0);
}
});
};
});
<input auto-complete ui-items="names" ng-init="manualcat='no category entered'" ng-model="manualcat">
那么,我如何正确地将这一切拼凑成Angular方式呢?
答案 0 :(得分:44)
我制作了一个自动完成指令并将其上传到GitHub。它还应该能够处理HTTP-Request中的数据。
以下是演示:http://justgoscha.github.io/allmighty-autocomplete/ 这里是文档和存储库:https://github.com/JustGoscha/allmighty-autocomplete
因此,当您想要从HTTP请求获取数据时,基本上您必须返回promise
,这在加载数据时会得到解决。因此,您必须在发出HTTP请求的位置注入$q
service / directive / controller。
示例:
function getMyHttpData(){
var deferred = $q.defer();
$http.jsonp(request).success(function(data){
// the promise gets resolved with the data from HTTP
deferred.resolve(data);
});
// return the promise
return deferred.promise;
}
我希望这会有所帮助。
答案 1 :(得分:36)
使用angular-ui-bootstrap的typehead。
它非常支持$ http和promises。 此外,它根本不包括任何JQuery,纯粹的AngularJS。
(我总是喜欢使用现有的库,如果他们缺少某些东西来打开问题或拉取请求,那么再好好再创建一个自己的库)
答案 2 :(得分:16)
您需要在范围内编写一个具有ng-change
功能的控制器。在ng-change
回调中,您可以调用服务器并更新完成。 Here is a stub(没有$http
因为这是一个插件):
HTML 的
<!doctype html>
<html ng-app="plunker">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.js"></script>
<script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.4.0.js"></script>
<script src="example.js"></script>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
</head>
<body>
<div class='container-fluid' ng-controller="TypeaheadCtrl">
<pre>Model: {{selected| json}}</pre>
<pre>{{states}}</pre>
<input type="text" ng-change="onedit()" ng-model="selected" typeahead="state for state in states | filter:$viewValue">
</div>
</body>
</html>
JS
angular.module('plunker', ['ui.bootstrap']);
function TypeaheadCtrl($scope) {
$scope.selected = undefined;
$scope.states = [];
$scope.onedit = function(){
$scope.states = [];
for(var i = 0; i < Math.floor((Math.random()*10)+1); i++){
var value = "";
for(var j = 0; j < i; j++){
value += j;
}
$scope.states.push(value);
}
}
}
答案 3 :(得分:5)
在没有外部模块或指令的angular或angularjs中最简单的方法是使用list和datalist HTML5。你只需要一个json并使用ng-repeat来提供datalist中的选项。 json你可以从ajax获取它。
在这个例子中:
然后你可以在ng-reapet中添加过滤器和orderby
<强> !! list和datalist id必须具有相同的名称!!
<input type="text" list="autocompleList" ng-model="ctrl.query" placeholder={{ctrl.msg}}>
<datalist id="autocompleList">
<option ng-repeat="Ids in ctrl.dataList value={{Ids}} >
</datalist>
UPDATE:是原生HTML5,但对于浏览器和版本类型仍然很好。 看看:https://caniuse.com/#search=datalist。
答案 4 :(得分:0)
我发现this链接很有用
$scope.loadSkillTags = function (query) {
var data = {qData: query};
return SkillService.querySkills(data).then(function(response) {
return response.data;
});
};