Проблема с angularjs typeahead и асинхронным вызовом API - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть следующая реализация, html:

<input id="myField" name="myField" class="form-control" type="text" placeholder="myField"
ng-model="myController.myObj.FieldValue" typeahead-editable="false" 
uib-typeahead="item as item.Description for item in myController.fieldDS($viewValue)" required>

Контроллер: * +1004 *

var vm = this;
vm.fieldDS = myService.getFieldDS;

обслуживание:

function getFieldDS() {
return [{'Description': 'ItemA'}, {'Description': 'ItemB'}, {'Description': 'ItemC'}];
}

И все работает отлично. Проблема начинается, когда я пытаюсь вызвать удаленный асинхронный интерфейс API. Я изменил сервис, используя ngResource, и я попробовал следующие функции:

function getFieldDS() {
  return Resource.query();
}

function getFieldDS() {
  var items = Resource.query();
  return items.$promise;
}

function getFieldDS() {
  var items = Resource.query();
  items.$promise.then(
     function (result, responseHeaders) {
       return result;
     },
     function (httpResponse) { console.log('failed: ' + httpResponse); }
  );
}

или с кодом на контроллере:

vm.fieldDS = myService.getFieldDS;

vm.fieldDS = function () {return myService.getFieldDS();};

myService.getFieldDS().then(function (result) { vm.fieldDS = result;})

в последнем случае я получаю ошибку типа об ожидаемой функции, может быть, typeahead не найден источник привязки!?

Во всех других случаях, когда я вставляю символ в поле ввода при загрузке страницы, вызывается api, но в списке ввода ничего не отображается. Если я попробую console.log с ответом на запрос или из сервиса, массив будет получен правильно. Кажется, что поле ввода контроллера или typeahead не ждет ответа от API, но я не понимаю, как решить эту проблему. Пожалуйста, вы можете мне помочь? Большое спасибо

редактирование: способ обслуживания:

function getFieldDS() {
  var items = Resource.query();
  return items.$promise;
}

и контроллер:

function getSomething() {
 var temp = myService.getFieldDS();
 temp.then(
   function(result) {
     console.log(result);
     return result;
   }
 );
 return temp;
}
vm.fieldDS = getSomething;

выводит на консоль правильный массив со всеми объектами, но они не добавляются в поле typeahead. Я нашел пример кода с той же реализацией, но я не понимаю, почему в моем случае он не работает.

1 Ответ

0 голосов
/ 30 апреля 2018

Проблема решена! Проблема связана с конфликтом с модулем block-ui. Настройте его blockUiConfig с помощью autoblock = false;

...