Angularjs: input [text] ngChange se déclenche pendant que la valeur change

ngChange se déclenche pendant que la valeur change (ngChange ne sont pas similaires à l'événement onChange classique). Comment puis-je lier l'événement onChange classique avec angularjs, qui ne se déclenche que lorsque le contenu est Commité?

Actuelle de liaison:

<input type="text" ng-model="name" ng-change="update()" />
91
demandé sur Kaffee Bohne 2012-08-08 19:52:11

8 réponses

Ce post montre un exemple d'une directive que les retards les changements de modèle à une entrée jusqu'à ce que le flou événement se déclenche.

ici est un violon qui montre le ng-change travaillant avec la nouvelle directive ng-model-on-flou. Notez qu'il s'agit d'une légère modification au violon original .

si vous ajoutez la directive à votre code, vous changerez votre reliure à ceci:

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

Voici la directive:

// 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());
                });         
            });
        }
    };
});

Note: comme @wjin le mentionne dans les commentaires ci-dessous, cette fonctionnalité est prise en charge directement dans L'angle 1.3 (actuellement en beta) via ngModelOptions . Voir les docs pour plus d'info.

96
répondu Gloopy 2014-06-18 01:25:17

il s'agit d'ajouts récents à AngularJS, pour servir de réponse future (également pour une autre question ).

Angular nouvelles versions (maintenant en beta 1.3), AngularJS soutient nativement cette option, en utilisant ngModelOptions , comme

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

NgModelOptions docs

exemple:

<input type="text" name="username"
       ng-model="user.name"
       ng-model-options="{updateOn: 'default blur', debounce: {default: 500, blur: 0} }" />
32
répondu manikanta 2017-05-23 11:54:22

dans le cas où n'importe qui d'autre recherche pour" entrer "supplémentaire le soutien de keypress, voici une mise à jour au violon fourni par maussade 151960920""

Code pour la reliure au clavier:

elm.bind("keydown keypress", function(event) {
    if (event.which === 13) {
        scope.$apply(function() {
            ngModelCtrl.$setViewValue(elm.val());
        });
    }
});
8
répondu Bing Han 2017-05-23 11:54:22

pour quiconque lutte avec IE8 (il n'aime pas le unbind('input'), j'ai trouvé un moyen de contourner.

injectez $sniffer dans votre directive et utilisez:

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

IE8 calme si vous faites ceci:)

5
répondu Brad Barrow 2013-01-02 04:29:05

à ma connaissance, nous devrions utiliser ng-change avec l'option select et dans le cas de textbox nous devrions utiliser ng-blur.

4
répondu Anni 2015-03-13 12:15:30

N'utilise pas $scope.$montre pour refléter les modifications de la portée de la variable de mieux?

3
répondu Zahiduzzaman 2014-01-14 09:58:49

outrepasse le comportement d'entrée onChange par défaut (appeler la fonction seulement lorsque le contrôle de perte de focalisation et de la valeur a modifier)

NOTE: ngChange n'est pas similaire à l'événement onChange classique qu'il déclenche l'événement pendant que la valeur change cette directive stocke la valeur de l'élément quand il obtient la mise au point

Sur les flous, il vérifie si le nouvelle valeur a changé et si oui, il déclenche l'événement

@param {String} - nom de la fonction à invoquer lorsque le " onChange" devrait être tiré

@exemple < input ma-sur-le changement="mafonction" ng-model="modèle">

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();
                    }
                }
            });
        }
    };
});
0
répondu user3119770 2013-12-25 11:49:15

j'ai eu exactement le même problème et cela a fonctionné pour moi. Ajoutez ng-model-update et ng-keyup et vous êtes prêt à partir! Voici le docs

 <input type="text" name="userName"
         ng-model="user.name"
         ng-change="update()"
         ng-model-options="{ updateOn: 'blur' }"
         ng-keyup="cancel($event)" />
0
répondu iMario999 2017-03-22 16:16:04