Angularjs: input [текст] ngChange срабатывает при изменении значения

ngИзменение стреляет, когда значение изменяется (ngChange не похож на классическое событие onChange). Как я могу связать классическое событие onChange с angularjs, которое будет срабатывать только при загрузке содержимого?

Текущая привязка:

<input type="text" ng-model="name" ng-change="update()" />

Ответ 1

Этот пост показывает пример директивы, которая задерживает изменение модели на вход до blur срабатывает событие.

Здесь - скрипт, показывающий изменение ng, работающее с новой директивой ng-model-on-blur. Обратите внимание, что это небольшая корректировка оригинальной скрипты .

Если вы добавите директиву в свой код, вы измените свою привязку к этому:

<input type="text" ng-model="name" ng-model-onblur ng-change="update()" />

Вот директива:

// override the default input to update on blur
angular.module('app', []).directive('ngModelOnblur', function() {
    return {
        restrict: 'A',
        require: 'ngModel',
        priority: 1, // needed for angular 1.2.x
        link: function(scope, elm, attr, ngModelCtrl) {
            if (attr.type === 'radio' || attr.type === 'checkbox') return;

            elm.unbind('input').unbind('keydown').unbind('change');
            elm.bind('blur', function() {
                scope.$apply(function() {
                    ngModelCtrl.$setViewValue(elm.val());
                });         
            });
        }
    };
});

Примечание. Как упоминает @wjin в комментариях ниже, эта функция поддерживается непосредственно в Angular 1.3 (в настоящее время в бета-версии) через ngModelOptions. Подробнее см. .

Ответ 2

Это касается недавних дополнений к AngularJS, чтобы служить в качестве будущего ответа (также для другого вопроса).

Angular более новые версии (теперь в 1.3 beta), AngularJS поддерживает эту опцию, используя ngModelOptions, например

ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }"

Документы NgModelOptions

Пример:

<input type="text" name="username"
       ng-model="user.name"
       ng-model-options="{updateOn: 'default blur', debounce: {default: 500, blur: 0} }" />

Ответ 3

Если кто-то еще ищет дополнительную поддержку "enter" keypress, здесь обновляется fiddle, предоставляемое Gloppy

Код для привязки клавиш:

elm.bind("keydown keypress", function(event) {
    if (event.which === 13) {
        scope.$apply(function() {
            ngModelCtrl.$setViewValue(elm.val());
        });
    }
});

Ответ 4

Для тех, кто борется с IE8 (ему не нравится unbind ( "enter" ), я нашел способ обойти его.

Ввести $sniffer в свою директиву и использовать:

if($sniffer.hasEvent('input')){
    elm.unbind('input');
}

IE8 успокаивается, если вы это сделаете:)

Ответ 5

По моим сведениям, мы должны использовать ng-change с опцией select, а в текстовом поле мы должны использовать ng-blur.

Ответ 6

Не использует $scope. $watch, чтобы лучше отражать изменения переменной области видимости?

Ответ 7

Отменить ввод по умолчанию в режиме "Изменить" (вызывать только функцию когда фокус контроля и значение были изменены)

ПРИМЕЧАНИЕ: ngChange не похож на классическое событие onChange, которое оно запускает событие при изменении значения. Эта директива сохраняет значение элемента, когда он получает фокус
В случае размытия он проверяет, новое значение изменилось, и если это произойдет, событие

@param {String} - имя функции, которое будет вызываться, когда "onChange" следует уволить

@example < введите my-on-change = "myFunc" ng-model = "model" >

angular.module('app', []).directive('myOnChange', function () { 
    return {
        restrict: 'A',
        require: 'ngModel',
        scope: {
            myOnChange: '='
        },
        link: function (scope, elm, attr) {
            if (attr.type === 'radio' || attr.type === 'checkbox') {
                return;
            }
            // store value when get focus
            elm.bind('focus', function () {
                scope.value = elm.val();

            });

            // execute the event when loose focus and value was change
            elm.bind('blur', function () {
                var currentValue = elm.val();
                if (scope.value !== currentValue) {
                    if (scope.myOnChange) {
                        scope.myOnChange();
                    }
                }
            });
        }
    };
});

Ответ 8

У меня была точно такая же проблема, и это сработало для меня. Добавьте ng-model-update и ng-keyup, и вы хорошо пойдете! Вот docs

 <input type="text" name="userName"
         ng-model="user.name"
         ng-change="update()"
         ng-model-options="{ updateOn: 'blur' }"
         ng-keyup="cancel($event)" />