Два вызова функций в поле ввода, один onBlur и один не в Angular

У меня есть поле ввода с двумя функциями для запуска. Один должен быть включен-размытие, это проверка поля. Другой должен быть типом пользователя, это функция uib-typeaheaduses.

Прямо сейчас я использую ng-model-options="{ updateOn: 'blur' }", но тогда он не будет запускать опережение ввода по мере того, как пользователь вводит.

Есть ли способ сделать так, чтобы функция проверки срабатывала при размытии, а ввод текста нормально срабатывал?

Например, я вызываю директиву number-validation, которую хочу вызвать для размытия. Затем в typehead я хочу вызвать функцию триггера, когда пользователь вводит.

                          <input
                           number-validation
                           type="text"
                           maxlength="10"
                           class="form-control input-sm"
                           ng-model="number"
                           ng-change="number.elsewhere = null"
                           required
                    uib-typeahead="number for number in triggerfunction($viewValue)"
                    typeahead-template-url="/template.html"
                    typeahead-loading="Loadinglocations" typeahead-on-select="SelectFunction($item, 1)" typeahead-wait-ms="3"
                    typeahead-min-length="3">

person jenryb    schedule 16.05.2016    source источник


Ответы (2)


Для «размытия» вы можете использовать «ng-blur». Для функции опережающего ввода используйте «ng-keyup».

Вот скрипка с примером...

https://jsfiddle.net/eh2morxb/

И вот код...

<input type="text" ng-model="inputText" ng-blur="blurHandler()" ng-keyup="typeAhead()" placeholder="Type something...">

angular.module("myApp", []).controller("myController", ["$scope", function($scope) {
  $scope.inputText = "";
  $scope.typeAheadMessage = "";
  $scope.blurMessage = "";

  $scope.blurHandler = function() {
    $scope.blurMessage = "Perform input validation on " + $scope.inputText;
  };

  $scope.typeAhead = function() {
    $scope.typeAheadMessage = "Perform type-ahead lookup on " + $scope.inputText;
  };
}])
person WonderGrub    schedule 16.05.2016
comment
будет ли это обрабатывать вызов директивы? Я обновил свой вопрос, чтобы привести пример. - person jenryb; 16.05.2016
comment
Это зависит от директивы. На самом деле вы не вызываете директивы, они действуют в соответствии с тем, как они разработаны. В случае пользовательской директивы проверки вы захотите связать ее с коллекцией $parsers. Angular позаботится обо всем остальном. - person WonderGrub; 16.05.2016
comment
У меня уже есть работающая пользовательская проверка, и я хочу, чтобы она вызывала onBlur. Это работает с использованием ng-model-options, но, по-видимому, не с ng-blur. Привязка его к $parsers не поможет, потому что $parsers вызываются каждый раз, когда пользователь изменяет значение. - person jenryb; 16.05.2016
comment
Если у вас есть функция размытия, работающая с использованием ng-model-options, я бы предположил, что вы можете просто придерживаться этого метода и добавить ng-keyup для опережающего ввода. Можно ли создать скрипт, который включает вашу пользовательскую проверку? - person WonderGrub; 16.05.2016
comment
Этот метод имел бы смысл, за исключением того, что typeahead уже использует uib-typeahead. Я не знаю, как также включить ng-keyup поверх этого. Пользовательская проверка просто проверяет, действителен ли номер, если нет, он открывает новое окно. - person jenryb; 16.05.2016
comment
Ok. Теперь я вижу в вашем новом примере, что вы используете UI Bootstrap. Это определенно меняет дело. Нет смысла использовать ng-keyup, если вы уже используете uib-typeahead. Теперь я не совсем уверен, чего вы пытаетесь достичь. Вы просто пытаетесь ограничить ввод цифрами? - person WonderGrub; 16.05.2016
comment
Давайте продолжим обсуждение в чате. - person jenryb; 16.05.2016

вы можете использовать ng-blurdirective для запуска события при размытии https://docs.angularjs.org/api/ng/directive/ngBlur

person Maxwelll    schedule 16.05.2016
comment
Я знаю, как вызвать что-то при размытии. Я не хочу запускать ОБЕ функции при размытии, только одну. Я добавил пример для демонстрации/ - person jenryb; 16.05.2016