Программно выберите параметр AngularJS Typeahead

У меня есть AngularJS Typeahead, который асинхронно извлекает совпадения. Когда штрих-код сканируется в поле, он возвращает соответствующий результат, но пользователь все равно должен его выбрать. Я хотел бы автоматически выбрать результат, если он точно совпадает. Я вижу, что в typeahead есть функция select(idx), но я не уверен, как получить ссылку на нее из моего контроллера.

Я представлял что-то вроде этого:

$scope.SearchItems = function (term) {
    return $http.get('api/Items/Search', {
        params: {
            term: term
        }
    }).then(function (response) {
        if (response.data.length == 1 && response.data[0].Code == term) {
            // Somehow inform typeahead control to select response.data[0]
        }
        return response.data;
    });
};

person Parker Hillius    schedule 06.12.2014    source источник
comment
Не могли бы вы добавить console.log(ответ) и сообщить мне, что он возвращает?   -  person Nicolas2bert    schedule 10.10.2015
comment
{ config: {...}, data: [{ Code = ABC, OtherProperties = Values ​​}], статус: 200, statusText: OK }   -  person Parker Hillius    schedule 11.10.2015


Ответы (1)


У меня была похожая проблема, и я так и не понял, как получить доступ к select(idx) шапки, но мне удалось заставить эту функцию работать. Вот мой хакерский обходной путь....

$promise.then(function(res) {
 angular.forEach(res, function(item, key) {

     // if we have an exact match
     if (item.title === term) {
         // update model
         $scope.src = item;

         // find item in dropdown
         var elm = '[id*=option-' + key + ']';
         var opt = angular.element(document.querySelectorAll(elm));

         //call click handler outside of digest loop
         $timeout(function() {
             opt.triggerHandler('click');
         }, 0);
     }
 });
 // return async results
 return res;
});

По сути, мы просто обновляем нашу модель вручную, находим элемент в раскрывающемся списке, а затем запускаем обработчик «щелчка». Убедитесь, что вы обернули вызов triggerHandler вызовом $timeout(), равным нулю, иначе вы получите ошибку $rootScope:inprog, поскольку дайджест уже выполняется.

person accraze    schedule 09.10.2015
comment
Это будет работать, если на странице есть только один шрифт, верно? Если у вас их несколько, он попытается выбрать этот индекс для каждого типа. - person Parker Hillius; 11.10.2015
comment
Да, это правильно, но, насколько я понимаю, параметры ввода текста видны только в том случае, если используется ввод текста.... поэтому, если у вас есть несколько вариантов ввода, будет выбрана только видимая опция. - person accraze; 12.10.2015