AngularJs ng изменяется только при изменении значений в текстовом поле - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть текстовое поле в приложении, я использую пользовательскую директиву change-on-blur, чтобы проверить это поле на вкладке, то есть, если я сначала наберу ABCD в этом текстовом поле, то я удалю символ D и снова наберу D, поэтому пользовательское изменение на размытие будет вызываться только один раз.

В некоторых случаях я использую ng-model-options="{updateOn: 'blur'}" ng-change="validate(data)" вместо ng-blur для этого элемента. Поэтому, если я наберу ABCD, она вызовет функцию, снова удаляю и наберу символ D, и снова вызову эту функцию. Существует ли пользовательская директива ng-change для вызова только один раз.

Я борюсь с этим в течение последних 2 дней. Пожалуйста, помогите

Html:

<input type="text" ng-model="data.taxNo" id="taxNo" 
        ngomitsplchar class="form-control taxNo" 
        maxlength="15" style="text-transform: uppercase;" 
        ng-paste="$event.preventDefault();"
        ng-model-options="{updateOn: 'blur'}" 
        ng-change="validate(data)" 
        tabindex="5" spellcheck="false" autocomplete="nope">

JS:

$scope.validate = function (obj) {
        alert("2"); // Prompting alert 2 times when using ng-change
    // Prompting alert 1 times when using change-on-blur

}

app.directive('changeOnBlur', function($timeout) {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, elm, attrs, ngModelCtrl) {
            if (attrs.type === 'radio' || attrs.type === 'checkbox') 
                return;

            var expressionToCall = attrs.changeOnBlur;

            var oldValue = null;
            elm.bind('focus',function() {
                //scope.$apply(function() {
                    oldValue = elm.val();
                //});
            });
            elm.bind('blur', function() {
                $timeout(function() {
                    var newValue = elm.val();
                    if (newValue !== oldValue){
                        scope.$eval(expressionToCall);
                    }
                        //alert('changed ' + oldValue);
                });         
            });
        }
    };
});

1 Ответ

0 голосов
/ 07 февраля 2020

Я нашел решение. Нужно изменить с ng-model-options="{updateOn: 'blur'}" на ng-model-options="{updateOn: '**change blur**'}". Таким образом, его ограниченный повторяющийся вызов при изменении того же значения в текстовом поле с помощью ng-change="validate(data)"

<input type="text" ng-model="data.taxNo" id="taxNo" 
        ngomitsplchar class="form-control taxNo" 
        maxlength="15" style="text-transform: uppercase;" 
        ng-paste="$event.preventDefault();"
        ng-model-options="{updateOn: 'change blur'}" 
        ng-change="validate(data)" 
        tabindex="5" spellcheck="false" autocomplete="nope">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...