2016-10-03 3 views
0

Я пытаюсь реализовать функциональность typeahead в своем макете, где содержимое таблицы обновляется по мере изменения значения typeahead, но оно выдает сообщение об ошибке ,Ошибка Angularjs: [filter: notarray] Ожидаемый массив, но полученный: {} в typeahead

Angularjs Error: [filter:notarray] Expected array but received: {}

vm.getEnterprises = function(term){ 
 
      vm.selected = undefined; 
 
      return $http.get(path +'/enterprise/'+ term + '/search') 
 
      .then(function(response){ 
 
       
 
       vm.customEnterprises = response.data; 
 
       vm.showcontent = true; 
 
       vm.defaultcontent = false; 
 
       return response.data; 
 
       console.log(response); 
 
      }); 
 
     }

Я использую MongoDB с Mongoose ОРМ в Node для внутреннего интерфейса, код API является,

var mongoose = require('mongoose'); 
 

 
var enterprise = mongoose.model('enterprise'); 
 

 
var search = function(req, res){ 
 

 
     
 
     var name = req.params.name; 
 
     var regexValue = '\.*' + name ; 
 
     
 
\t \t enterprise.find({'name': new RegExp(regexValue, 'i')},function(err, data){ 
 
\t \t \t if (err){ 
 
\t \t \t \t console.log('err',err); 
 
\t \t \t } else { 
 
\t \t \t \t return res.json(data); 
 
\t \t \t \t console.log(data); 
 
\t \t \t } 
 
\t \t }); 
 
} 
 
module.exports = { 
 
\t searchEnterprise : search 
 
};

Мой Угловой код пользовательского интерфейс,

input type="text" id="search" ng-model = "vm.selected" class="form-control input-md enable collapse" placeholder="search for an enterprise" uib-typeahead = "name as enterprise.name for enterprise in vm.getEnterprises($viewValue)| filter:$viewValue | limitTo : 3 "> 

ответ

0

Предположительно, вы в курсе filter принимает только Array в качестве входных данных, ваш vm.getEnterprises в основном возвращает обещание объекта не фактические данные.

Что вам нужно сделать, так это просто присвоить возвращаемые данные переменной уровня видимости (то есть той же области, что и ваш шаблон), например. $scope.retData затем измените шаблон

name as enterprise.name for enterprise in retData | filter:$viewValue | limitTo : 3 
+0

vm.getEnterprises ($ viewValue) вызывает функцию, которая делает вызов API в задней части, если я изменить его $ scope.retdata где делать, что вызов будет сделано. – Idlliofrio

+0

То, что я имел в виду, находится внутри вашего 'vm.getEnterprises' вместо' return response.data', присваивает данные ответа переменной уровня видимости и гарантирует, что ваш шаблон может получить к ней доступ, а затем измените 'in vm.getEnterprises ($ viewValue)' к этой переменной –

+0

Btw, на всякий случай, я думаю, вам не нужно 'return' для' $ http.get'. Таким образом, ваша функция 'vm.getEnterprises' в основном не возвращает ничего, кроме API вызовов, чтобы извлекать данные, а затем хранить данные для этой переменной уровня видимости. Затем 'uib-typehead' должен обнаруживать изменения этой переменной уровня видимости после устранения обещания. –

Смежные вопросы