У меня проблема со следующим вариантом использования в typeahead:
Проблема:
- пользователь начинает печатать, раскрывающийся список открывается и показывает результаты
- пользователь щелкает из поля ввода (из поля ввода ничего не удаляется), раскрывающийся список закрывается
- пользователь щелкает обратно в поле ввода с опережением ввода (и НЕ начинает ничего вводить), и ничего не происходит. → желаемое поведение: раскрывающийся список открывается снова и показывает тот же список результатов, что и в прошлый раз (конечно, это происходит только в том случае, если в поле ввода есть что-то)
- Когда пользователь ищет что-либо, и если результат найден и происходит потеря фокуса, и строка не очищается снова, фокус ничего не происходит, никаких подсказок
- Когда пользователь что-либо ищет, и если результат не найден и происходит потеря фокуса, строка очищается, а также появляется сообщение об отсутствии данных.
Итак, мораль этой истории заключается в том, что в первом случае строка должна быть очищена, если она не выбрана из списка и является подстрокой строки списка ...
Итак, может быть, настройка поиска с опережением по фокусу?
HTML:
<input type="text" focus-me="opened" ng-focus="onFocus($event)" ng-show="opened" ng-trim="false" ng-model="selected" empty-typeahead typeahead="state for state in states | filter:$viewValue:stateComparator" class="form-control" />
JS:
(function () {
var secretEmptyKey = '[$empty$]'
angular.module('plunker', ['ui.bootstrap'])
.directive('focusMe', function($timeout, $parse) {
return {
//scope: true, // optionally create a child scope
link: function(scope, element, attrs) {
var model = $parse(attrs.focusMe);
scope.$watch(model, function(value) {
if(value === true) {
$timeout(function() {
element[0].focus();
});
}
});
}
};
})
.directive('emptyTypeahead', function () {
return {
require: 'ngModel',
link: function (scope, element, attrs, modelCtrl) {
// this parser run before typeahead's parser
modelCtrl.$parsers.unshift(function (inputValue) {
var value = (inputValue ? inputValue : secretEmptyKey); // replace empty string with secretEmptyKey to bypass typeahead-min-length check
modelCtrl.$viewValue = value; // this $viewValue must match the inputValue pass to typehead directive
return value;
});
// this parser run after typeahead's parser
modelCtrl.$parsers.push(function (inputValue) {
return inputValue === secretEmptyKey ? '' : inputValue; // set the secretEmptyKey back to empty string
});
}
}
})
.controller('TypeaheadCtrl', function($scope, $http, $timeout) {
$scope.selected = undefined;
$scope.states = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Wyoming'];
$scope.opened = true;
$scope.stateComparator = function (state, viewValue) {
return viewValue === secretEmptyKey || (''+state).toLowerCase().indexOf((''+viewValue).toLowerCase()) > -1;
};
$scope.onFocus = function (e) {
$timeout(function () {
$(e.target).trigger('input');
$(e.target).trigger('change'); // for IE
});
};
});
}());
У меня есть Plunker, чтобы показать, как выглядит мой код.
Также существует проблема с GitHub.