ngChange odpala, gdy wartość się zmienia (ngChange nie są podobne do klasycznego zdarzenia onChange). Jak mogę powiązać klasyczne zdarzenie onChange z angularjs, które będzie uruchamiane tylko wtedy, gdy zawartość zostanie zatwierdzona?
Aktualne wiązanie:
<input type="text" ng-model="name" ng-change="update()" />
Odpowiedzi:
W tym poście przedstawiono przykład dyrektywy, która opóźnia zmiany modelu na dane wejściowe do momentu uruchomienia zdarzenia rozmycia .
Oto skrzypce, które pokazują zmianę ng działającą z nową dyrektywą ng-model-on-blur. Zwróć uwagę, że jest to niewielka modyfikacja oryginalnych skrzypiec .
Jeśli dodasz dyrektywę do swojego kodu, zmienisz swoje powiązanie na to:
<input type="text" ng-model="name" ng-model-onblur ng-change="update()" />
Oto dyrektywa:
// 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()); }); }); } }; });
Uwaga: jak @wjin wspomina w komentarzach poniżej, ta funkcja jest obsługiwana bezpośrednio w Angular 1.3 (obecnie w wersji beta) przez
ngModelOptions
. Zobacz dokumentację, aby uzyskać więcej informacji.źródło
ng-blur
dyrektywę: docs.angularjs.org/api/ng.directive:ngBlurng-model-options="{ updateOn: 'default blur' }"
Zobacz dokumentację$sniffer
do określenia, czy przeglądarka obsługuje `` wejście '', a jeśli nie, wracają do „keydown”. Jeśli zaktualizujesz powyższą dyrektywę, aby tylko usunąć powiązanie$sniffer.hasEvent('input')
Chodzi o ostatnie dodatki do AngularJS, które mają służyć jako przyszła odpowiedź (także na inne pytanie ).
Nowsze wersje Angulara (teraz w 1.3 beta), AngularJS natywnie obsługuje tę opcję, używając
ngModelOptions
npng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }"
Dokumentacja NgModelOptions
Przykład:
<input type="text" name="username" ng-model="user.name" ng-model-options="{updateOn: 'default blur', debounce: {default: 500, blur: 0} }" />
źródło
W przypadku, gdy ktoś szuka dodatkowej obsługi klawisza „enter”, oto aktualizacja skrzypiec dostarczonych przez Gloppy
Kod do przypisywania klawiszy:
elm.bind("keydown keypress", function(event) { if (event.which === 13) { scope.$apply(function() { ngModelCtrl.$setViewValue(elm.val()); }); } });
źródło
Dla każdego, kto zmaga się z IE8 (nie lubi unbind ('input'), znalazłem sposób na obejście tego.
Wprowadź $ sniffer do swojej dyrektywy i użyj:
if($sniffer.hasEvent('input')){ elm.unbind('input'); }
IE8 uspokaja się, jeśli to zrobisz :)
źródło
Zgodnie z moją wiedzą powinniśmy używać opcji ng-change z opcją select, aw przypadku pola tekstowego - ng-blur.
źródło
Czy nie używa się $ scope. $ Watch do lepszego odzwierciedlenia zmian zmiennej zakresu?
źródło
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(); } } }); } }; });
źródło
Miałem dokładnie ten sam problem i to zadziałało. Dodaj
ng-model-update
ing-keyup
gotowe! Oto dokumenty<input type="text" name="userName" ng-model="user.name" ng-change="update()" ng-model-options="{ updateOn: 'blur' }" ng-keyup="cancel($event)" />
źródło