Angularjs从$http自动完成

Angularjs从$http自动完成,angularjs,autocomplete,directive,angular-http,Angularjs,Autocomplete,Directive,Angular Http,我正在尝试编写一个autocomplete指令,它使用$http请求从服务器获取数据(不使用任何外部插件或脚本)。目前,它仅适用于静态数据。现在,我知道我需要将$http请求插入指令的源代码:,但是我找不到任何关于这个主题的好文档 function getMyHttpData(){ var deferred = $q.defer(); $http.jsonp(request).success(function(data){ // the promise gets resolved

我正在尝试编写一个autocomplete指令,它使用$http请求从服务器获取数据(不使用任何外部插件或脚本)。目前,它仅适用于静态数据。现在,我知道我需要将$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;
}
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;
}
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;
}

那么,我该如何正确地将这一切以角度的方式组合在一起呢

您需要在作用域中编写具有
ng change
功能的控制器。在
ng change
回调中,您可以调用服务器并更新完成。(不带
$http
,因为这是一个plunk):

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


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;
}
模型:{selected | json} {{states}}
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;
}
JS

angular.module('plunker',['ui.bootstrap']);
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;
}
函数类型headCtrl($scope){ $scope.selected=未定义; $scope.states=[]; $scope.onedit=函数(){ $scope.states=[]; 对于(var i=0;i
使用角度ui引导

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;
}
它对$http和promises有很大的支持。 此外,它根本不包括任何JQuery,纯AngularJS


(我总是喜欢使用现有的库,如果它们缺少打开问题或请求的内容,那就比重新创建自己的库要好得多)

我发出了一个自动完成指令,并将其上传到GitHub。它还应该能够处理来自HTTP请求的数据

下面是演示: 这里是文档和存储库:

因此,当您希望从HTTP请求获取数据时,基本上必须返回一个
承诺
,该承诺在加载数据时得到解决。因此,您必须在发出HTTP请求的地方注入
$q
服务/指令/控制器

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;
}
例如:

 <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>
我希望这有帮助。

我发现这个链接很有帮助


在angularjs或angularjs中,在没有外部模块或指令的情况下,最简单的方法是使用list和datalist HTML5。您只需获得一个json,并使用ng repeat在datalist中提供选项。您可以从ajax获取json

在本例中:

    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);
        }
      }
    }
    
  • ctrl.query是键入时输入的查询
  • ctrl.msg是显示在占位符中的消息
  • ctrl.dataList是获取的json
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);
    }
  }
}
然后,您可以在ng reapet中添加过滤器和orderby

!!列表和数据列表id必须具有相同的名称


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

谢谢你的回答,疯子。但是,正如我在问题中所说的,我试图避免使用任何外部脚本。在回答中,您使用的是angular ui引导脚本。我在寻找纯角度解。干杯,GidonI正在为
typeahead
指令(自动完成本身)使用angular ui。感谢Urigo的回答。但是,正如我在问题中所说的,我试图避免使用任何外部脚本。我在寻找纯角度解。干杯,Gidon请记住,从今天开始,angular ui引导程序中的Typeahead与angular 1.3Thanks@Rocco不兼容,您为我省去了很多麻烦!如何获取select上的id。这对我来说是在下载中包含的模板html文件上抛出了一个错误。这是必需的吗?如果是这样的话,您可能希望在文档中明确这一点。是否需要将所有数据提取到内存中?如果我有1000万以上的变体呢?:)@tuxSlayer下载前20个与您的标准相匹配的任何属性来限制结果的数量?这是否有一个可以设置的超时,例如。。。停止键入1秒后是否执行http请求?我不想让它在每个按键上都发出请求@你能提供完整的示例源代码吗?我只是想知道你实际上在什么时候进行HTTP调用。提前谢谢。你找到解决办法了吗?我面临着同样的问题,似乎$scope.names在加载指令时是空的,ajax调用被抛在后面
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;
}