Тип начальной загрузки Angularjs не работает: ошибка: [фильтр: notarray]

Мне нужно получить варианты предложений, используя 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.




Ответы (1)


Я предполагаю, что ваша разметка typehead выглядит следующим образом:

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

Почему это не работает:

Проблема возникает, когда массив элементов извлекается асинхронно. В вашем случае функция getItems называется getListofNames, и ваши элементы действительно извлекаются асинхронно из-за вызова $http. Поэтому в момент возникновения ошибки getListofNames() все еще является неразрешенным объектом промиса, а не массивом имен.

Как вы могли заставить это работать:

Удалите фильтр из шаблона. Вы должны отфильтровать массив, прежде чем возвращать его в getItems. В идеале фильтрацию следует выполнять на стороне сервера. Действительно, сервер получает введенную пользователем подстроку (это аргумент $viewValue), а значит, у него есть все данные для фильтрации массива. Это предотвратило бы возврат всех элементов и сделало бы ответ короче. В качестве альтернативы вы можете отфильтровать клиентскую сторону в обратном вызове обещания:

$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
        }
    );
};
person Michael P. Bazos    schedule 16.09.2015
comment
Это был прорыв! - person Aravind; 01.10.2015
comment
Еще одна вещь, поскольку 1.3.3 ng не поддерживает развертывание промисов. Вот почему он видит объект обещания, а не разрешенный массив. - person IamStalker; 23.04.2016