angular.js ui + bootstrap typeahead + 异步调用

2024-05-15

我将 typeahead 与 angular.js 指令一起使用,但填充自动完成的函数进行了异步调用,我无法返回它来填充自动完成。有没有办法让它与这个异步调用一起工作?


我可以假设您正在使用 Bootstrap 2.x 的 typeahead 吗?

如果是这样,在文档中,描述了source现场typeahead()的选项是这样的:

要查询的数据源。可能是字符串数组或 功能。该函数传递两个参数,查询值在 输入字段和流程回调。可以使用该功能 通过直接或异步返回数据源来同步 通过进程回调的单个参数。

你绝对可以传入一个异步函数作为source属性。这source函数可能是这样的:

function someFunction(query, process) {
  someAsyncCall(...query or so... , function(res) { // success callback
    process(res);
  }, function(err) {                                // error callback
    process(null);
  });
}

Update:

如果您使用 Angular Bootstrap 的 typeahead,它应该会更容易。根据 Angular Bootstrap 的文档(http://angular-ui.github.io/bootstrap/ http://angular-ui.github.io/bootstrap/),你可以只返回一个承诺typeahead功能。文档中的一些示例:

$scope.getLocation = function(val) {
  return $http.get('http://maps.googleapis.com/maps/api/geocode/json', {
    params: {
      address: val,
      sensor: false
    }
  }).then(function(res){
    var addresses = [];
    angular.forEach(res.data.results, function(item){
      addresses.push(item.formatted_address);
    });
    return addresses;
  });
};

更简单的可能是:

$scope.getSomething= function(query) {
  var promise = $http.get('...some url...', {
    params: {
      queryName: query
    }
  });
  return promise;
};

或者你可以建立自己的承诺:

$scope.getSomething= function(query) {
  var deferred = $q.defer();
  someAsyncCall(...query or so... , function(res) { // success callback
    deferred.resolve(res);
  }, function(err) {                                // error callback
    deferred.reject(err);
  });
  return deferred.promise;
};

事实上,很多服务,比如$http只是当你打电话给他们时返回承诺。 有关 AngularJS 中 Promise 的更多信息:https://docs.angularjs.org/api/ng/service/ https://docs.angularjs.org/api/ng/service/$q

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

angular.js ui + bootstrap typeahead + 异步调用 的相关文章

随机推荐