Автозаполнение Angularjs от $http
Я пытаюсь написать директиву автозаполнения, которая извлекает данные с сервера с помощью запроса $http (без использования каких-либо внешних плагинов или скриптов). В настоящее время он работает только со статическими данными. Теперь я знаю, что мне нужно вставить мой запрос $http в директиву source:
, но я не могу найти хорошую документацию по этому вопросу.
http-запрос
$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?
Ответы
Ответ 1
Я сделал директиву автозаполнения и загрузил его в GitHub. Он также должен иметь возможность обрабатывать данные из HTTP-запроса.
Здесь демо: http://justgoscha.github.io/allmighty-autocomplete/
И здесь документация и репозиторий: https://github.com/JustGoscha/allmighty-autocomplete
Таким образом, вы должны вернуть promise
, когда хотите получить данные из HTTP-запроса, который будет разрешен при загрузке данных. Поэтому вы должны ввести $q
службу/директиву/контроллер, где вы отправляете свой HTTP-запрос.
Пример:
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;
}
Надеюсь, это поможет.
Ответ 2
Используйте angular -ui-bootstrap typehead.
У него была отличная поддержка $http и promises.
Кроме того, он не включает в себя никакой JQuery вообще, чистый AngularJS.
(Я всегда предпочитаю использовать существующие библиотеки, и если им что-то не хватает, чтобы открыть проблему или вытащить запрос, гораздо лучше, чем создавать свои собственные снова)
Ответ 3
Вам нужно написать контроллер с функцией ng-change
в области. В обратном вызове ng-change
вы выполняете вызов сервера и завершаете обновление. Вот заглушка (без $http
, поскольку это plunk):
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);
}
}
}
Ответ 4
Самый простой способ сделать это в angular или angularjs без внешних модулей или директив - использовать список и datalist HTML5. Вы просто получаете json и используете ng-repeat для подачи опций в datalist. Json вы можете получить из ajax.
в этом примере:
- ctrl.query - это запрос, который вы вводите при вводе.
- ctrl.msg - это сообщение, которое отображается в заполнителе
- ctrl.dataList - это извлеченный json
то вы можете добавить фильтры и orderby в ng-reapet
!! список и идентификатор datalist должны иметь одно и то же имя!
<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.
Ответ 5
Я нашел эту ссылку полезную
$scope.loadSkillTags = function (query) {
var data = {qData: query};
return SkillService.querySkills(data).then(function(response) {
return response.data;
});
};
Ответ 6
страница https://code.sololearn.com/WgkF6SwpUNVm/#html предоставляет очень хороший пример автозаполнения с использованием только angularjs (хотя это и сжатые данные, а не $ http)