Angular uib typeahead, typeahead-is-open не работает

#javascript #angularjs #angular-ui-bootstrap

#javascript #angularjs #angular-ui-bootstrap

Вопрос:

У меня есть angular uib-typeahead. Вот ссылка на plunkr, которую я создал.https: //plnkr.co/edit/8XwhSXsZlyd0oKSljS9t?p=предварительный просмотр.

Я использовал свойство typeahead-is-open .

Я хочу, чтобы при нажатии на uib-typeahead он открывался и отображал все значения. Я предполагаю, что установка значения typeahead-is-open в true выполняет эту работу. Правильно ли это? В настоящее время typeahead не открывается при установке значения typeahead-is-open в значение true.

Вот мой html

 <input ng-click = "myFunc()" click-outside="typeaheadIsOpen = false;" type="text" ng-model="selected" uib-typeahead="state for state in states | filter:$viewValue | limitTo:8" typeahead-is-open="typeaheadIsOpen" class="form-control">
  

Мой JS

 $scope.myFunc = function() {
   $timeout(function() {
       $scope.typeaheadIsOpen = true;
       $scope.$digest();
   })
}
  

Я привязал typeahead-is-open к переменной «typeaheadIsOpen». При нажатии на typeahead я вызываю myFuc(), который устанавливает для переменной typeaheadIsOpen значение true .

Но typeahead не открывается. Я что-то делаю не так?

Ответ №1:

Кажется, вы не можете контролировать, отображается ли всплывающее окно typeahead или нет, используя typeahead-is-open атрибут. Вот соответствующая часть из исходного кода:

UibTypeaheadController

 //binding to a variable that indicates if dropdown is open
var isOpenSetter = $parse(attrs.typeaheadIsOpen).assign || angular.noop;
...
scope.assignIsOpen = function (isOpen) {
    isOpenSetter(originalScope, isOpen);
};
  

Этот атрибут используется для получения выражения, используемого для обновления области видимости, когда typeahead открыт, но не используется для получения значения из области видимости, и соответствующий наблюдатель не настроен.

Ответ №2:

К сожалению, я все еще использую angularjs в 2021 году. В итоге я нашел хак, основанный на этих потоках

https://github.com/angular-ui/bootstrap/issues/6619
https://github.com/angular-ui/bootstrap/issues/759

Учитывая ввод typeahead

 <input class="form-control address_input" 
       type="text"
       typeahead-editable="true"
       typeahead-on-select=...
  

В контроллере в angular, который обрабатывает это, я создал функцию, подобную этой

 function _forceDropdownOpen() {
    const controller = $(".address_input").controller('ngModel');
    const old = controller.$viewValue;
    controller.$setViewValue(old  ' ');
    controller.$setViewValue(old);
}
  

Это просто имитирует добавление пробела к результату, а затем удаление этого пробела.

Вот пример моего приложения до и после. Мой вариант использования был после ввода третьей буквы, мой код отправляет HTTP-запрос. Когда этот запрос возвращается, и если у него есть результаты, я вызываю этот метод, чтобы открыть выпадающий список.

Before: выпадающий список не открывается, пока не будет введена четвертая буква

После: открывается сразу по результатам

введите описание изображения здесь