Ответ 1
Я могу подтвердить проблемы, связанные с расширением UX типа head. В то время как решение @ueq работает, у него проблемы с выпуском фокуса/клика. Я предлагаю изменить вещи, в частности как запускать открытый UX.
предлагаемые изменения
- открыть с двойным щелчком - это решает вопрос о выпуске кликов в ответ @ueq
- проверить существующие значения, чтобы не перезаписывать значение - мы не хотим случайно перезаписывать существующие данные при открытии, поэтому сначала проверьте сначала значение недопустимого значения для запуска открытого.
- измените название директивы.... переходите к чему-то более описательному - учитывая, что ui.bootstrap уже изменил свое пространство имен, перемещающееся с 13.x до 14.x, просто имеет смысл идти с вашим собственным именем. Поскольку директивы могут представлять как UI, так и UX, имеет смысл называть вашу директиву тем, что другие разработчики могут позже отслеживать легче.
почему
При работе с typeahead у людей есть определенные ожидания UX. Нажатие на ввод и наличие чего-то всплывающего окна могут быть несколько резкими и неправильными. Один щелчок или вкладка-фокус на вход традиционно ничего не делает, кроме как готовить вход для взаимодействия с клавиатурой. Двойной щелчок обычно предполагает, что произойдет нечто большее (например, дважды щелкните файл и закройте диалоговое окно выбора по сравнению с одним щелчком мыши, чтобы выбрать, затем нажмите "ОК", чтобы закрыть).
В программировании мы часто пытаемся использовать разделение проблем парадигмы на наш код. Но я думаю, что это может быть применено и к этому конкретному UX и UX в целом. Пусть однократное нажатие и вкладка делают то, что они делали в течение многих лет, и используют двойной щелчок, чтобы развернуть UX типа headhead.
plunker - http://plnkr.co/edit/GGl6X4klzVLKLX62Itbh?p=preview
.directive('typeaheadClickOpen', function($parse, $timeout) {
return {
restrict: 'A',
require: 'ngModel',
link: function($scope, elem, attrs) {
triggerFunc = function(evt) {
var ctrl = elem.controller('ngModel'),
prev = ctrl.$modelValue || '';
if (prev) {
ctrl.$setViewValue('');
$timeout(function() {
ctrl.$setViewValue(prev);
});
} else {
ctrl.$setViewValue(' ');
}
}
elem.bind('dblclick', triggerFunc);
}
}
})