Ich habe Probleme in folgenden Anwendungsfall in typeahead wieder öffnen:AngularJS [typeahead] Ergebnis Drop-Down auf onFocus
Problem:
- Benutzer startet die Eingabe, Drop-Down-öffnet und zeigt die Ergebnisse
- Benutzer klickt aus dem Eingabefeld (nichts aus dem Eingabefeld gelöscht wird), schließt Dropdown
- Benutzer klickt zurück in das typeahead Eingabefeld (und nicht startet, alles zu geben) und nichts passiert. → das gewünschte Verhalten ist: Dropdown öffnet sich wieder und zeigt das gleiche Ergebnis Liste wie beim letzten Mal (natürlich, dass nur geschieht, wenn es irgendetwas in das Eingabefeld ist)
- Wenn alles Benutzer suchen und, wenn das Ergebnis gefunden und den Fokus verloren auftritt und String erhält nicht wieder gelöscht konzentriert nichts passieren, keine Hinweise
- wenn Benutzer Suchanfrage alles und wenn das Ergebnis nicht gefunden und den Fokus verloren auftritt Zeichenfolge erhalten gelöscht und es gibt auch Nachricht von nicht gefundenen Daten.
So Moral der Geschichte ist, dass sollte in ersten Fall Zeichenfolge gelöscht erhalten, wenn sie nicht aus der Liste ausgewählt ist, und es ist Teilzeichenfolge der Liste String ...
Also, vielleicht ein typeahead- Such-Fokus-Einstellung?
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
});
};
});
}());
Ich habe diese Plunker zu zeigen, wie mein Code aussieht.
Es gibt auch GitHub Issue.