我需要使用typeahead进行http调用来获取建议选项

$scope.getlist = function getListofNames(name) {
 return $http({
   method: 'GET',
     url: '/v1/'+name,
     data: ""
 }).then(function(response){

     if(response.data.statusMessage !== 'SUCCESS'){
         response.errorMessage = "Error while processing request. Please retry."
           return response;
     }

         else {
           return response.data.payload;
         }

       }, function(response){
       response.errorMessage = "Error while processing request"
           return response;
       }
       );
}

response.data.payload是一个对象数组,已成功获取,但出现此错误
错误:[filter:notarray] http://errors.angularjs.org/1.4.5/filter/notarray吗?

注意:我正在使用angular 1.4.5和Bootstrap v3.1.1

最佳答案

我猜您的预输入标记看起来像这样:

<input [...] typeahead="item in getItems($viewValue) | filter: $viewValue">

为什么不起作用:

当项目数组是异​​步获取时,会发生此问题。在您的情况下,getItems函数称为getListofNames,并且由于对$http的调用,您的商品确实是异步获取的。因此,在发生错误时,getListofNames()仍是一个 Unresolved promise 对象,尚未包含名称数组。

您如何进行这项工作:

从模板中删除过滤器。您应该先过滤数组,然后再将其返回getItems理想情况下,您要过滤服务器端。实际上,服务器接收到用户键入的子字符串(这是$viewValue参数),因此它具有所有数据以过滤数组。这将防止返回所有元素,并使响应时间缩短。
或者,您可以在promise的回调中过滤客户端:
$scope.getList = function getListofNames(name) {
    return $http(...}).then(
        function(response){
            // filter response.data.payload according to
            // the 'name' ($viewValue) substring entered by the user
            return filteredArray; // <- no need to pipe a filter in the template anymore
        }
    );
};

10-06 04:18