Angularjs autocomplete from $http Angularjs autocomplete from $http angularjs angularjs

Angularjs autocomplete from $http


I made an autocomplete directive and uploaded it to GitHub. It should also be able to handle data from an HTTP-Request.

Here's the demo: http://justgoscha.github.io/allmighty-autocomplete/And here the documentation and repository: https://github.com/JustGoscha/allmighty-autocomplete

So basically you have to return a promise when you want to get data from an HTTP request, that gets resolved when the data is loaded. Therefore you have to inject the $qservice/directive/controller where you issue your HTTP Request.

Example:

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;}

I hope this helps.


Use angular-ui-bootstrap's typehead.

It had great support for $http and promises.Also, it doesn't include any JQuery at all, pure AngularJS.

(I always prefer using existing libraries and if they are missing something to open an issue or pull request, much better then creating your own again)


You need to write a controller with ng-change function in scope. In ng-change callback you do a call to server and update completions. Here is a stub (without $http as this is a 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);    }  }}