Подтвердить что ты не робот

Как angular ui typeahead trigger при фокусировке

Я использую angular -ui typeahead. Как я могу запускать всплывающие элементы, когда фокусируюсь на поле ввода, а не после ввода.

4b9b3361

Ответ 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);
        }
    }
})

Ответ 2

Привет, у меня была такая же проблема, и с это обсуждение github Я смог понять: установить директиву, которая вызывает $setViewValue как

.directive('typeahead', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attr, ctrl) {
            element.bind('click', function () {
                ctrl.$setViewValue(' ' );
            });
            element.bind('blur', function () {
                ctrl.$setViewValue('');
            });
        }
    };
});

и добавьте его в свой input:

<input type="text" [...] typeahead>

Результат (я создал plkr: http://plnkr.co/edit/Si6tFK2AammZy1HqEQzA):

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

Надеюсь, что помогает:)

Ответ 3

Используйте typeahead-min-length = "0", если поддерживается вашей версией angular -ui. В противном случае это поможет вам:

directive('typeaheadOpenOnFocus', function ($timeout) {
       return {
        require: 'ngModel',
        link: function (scope, element, attr, ctrl) {
            element.bind('click', function () {
                var vv = ctrl.$viewValue;
                ctrl.$setViewValue(vv ? vv+' ': ' ' );
                $timeout(function(){ctrl.$setViewValue(vv ? vv : '');},10)
            });
        }
    };
})

и добавьте typeahead-open-on-focus как атрибут к вашему элементу ввода.

Это откроет typeahead onfocus, если оно уже имеет значение. И он автоматически возвращает значение view.