Angularjs : input [text] ngChange는 값이 변경되는 동안 발생합니다.


92

값이 변경되는 동안 ngChange가 실행됩니다 (ngChange는 클래식 onChange 이벤트와 유사하지 않음). 콘텐츠가 커밋 될 때만 실행되는 angularjs로 클래식 onChange 이벤트를 바인딩하려면 어떻게해야합니까?

현재 바인딩 :

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

비슷한 것을 찾는 것만으로도 필드가 유효한 경우에만 업데이트를 고려할 수도 있다는 생각이 들었습니다. 이렇게하면 사용자가 입력을 유효한 형식으로 가져 오는 데 어려움을 겪을 수 있으며 (또는 프롬프트와 필터를 사용하여 도움을 줄 수 있음) 올바른 정보를 얻었을 때 업데이트로 보상 할 수 있습니다!
Steve Black

사용할 이벤트 (흐림뿐만 아니라)를 지정할 수있는 훨씬 더 유연한 솔루션과 기타 속성이 곧 angular에 내장되어야합니다. github.com/angular/angular.js/pull/2129
wired_in

답변:


96

이 게시물흐림 이벤트가 발생할 때까지 입력에 대한 모델 변경을 지연시키는 지시문의 예를 보여줍니다 .

다음 은 새로운 ng-model-on-blur 지시문과 함께 작동하는 ng-change를 보여주는 바이올린입니다. 이것은 원래 바이올린 을 약간 조정 한 것 입니다.

코드에 지시문을 추가하면 다음과 같이 바인딩을 변경할 수 있습니다.

<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. 자세한 정보 는 문서 를 참조하십시오.


1
주의, elm.unbind ( 'input')은 Internet Explorer 8에서 'TypeError'를 발생 시키므로 다른 unbind 문은 전혀 실행되지 않습니다. elm.unbind ( 'input')을 별도의 줄로 이동하고 try / catch 블록으로 둘러 싸서 해결했습니다.
Rob Juurlink 2013-08-26

1
Angular 1.2에는 다음과 같은 ng-blur지시문이 있습니다. docs.angularjs.org/api/ng.directive:ngBlur
JJ Zabkar 2013 년

5
이 코드가 작동하도록 만들었지 만 지시문의 우선 순위 (즉, 우선 순위 : 100)를 설정해야했습니다. Angular 1.2.10을 사용하고 있습니다. 내 생각 엔 ngModelOnblur 지시문이 ngModel 지시문 이전에 실행되었으므로 아직 바인딩을 해제 할 항목이 없었습니다. 또한이 페이지는 미래에이를위한 내장 솔루션이있는 것처럼 보이게합니다. github.com/angular/angular.js/pull/1783
Alan West

4
이 기능을 통해 기본 구현에서 지원되는 각 1.3 적어도 참고 ng-model-options="{ updateOn: 'default blur' }"참조 문서
wjin

2
@RobJuurlink (또는 'input'에 바인딩하거나 바인딩 해제하려고 할 때 IE8 'TypeError'가 발생하는 다른 사람)-Angular의 소스를 보면 $sniffer브라우저가 '입력'을 지원하는지 확인하는 데 사용하는 것을 볼 수 있습니다 . 그들은 'keydown'으로 돌아갑니다. $sniffer.hasEvent('input')true를 반환하는 경우에만 'input'바인딩을 해제하도록 위의 지시문을 업데이트하면 해당 오류를 피하고 IE8에서 계속 작동 할 수 있습니다
bvaughn

32

이것은 AngularJS에 대한 최근 추가 사항으로 향후 답변으로 사용됩니다 (또한 다른 질문에 대해서도 ).

(현재 베타 1.3) 각도 최신 버전은 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} }" />

그것은 1.3 베타 5에서 올바른 작동하지만 현재 마스터 빌드 2602에서 해결하지 않습니다
manikanta

이것이 바로 제가 지금 만들고있는 것과 같은 "실제"응용 프로그램에서 아직 베타 버전이고 사용할 수없는 이유입니다.
reaper_unique 2014-08-27

여기에 각도 1.2.x 이전 버젼을위한 모듈과 같은 NG-모델 옵션의 github.com/fergaldoyle/modelOptions
Fergal

8

추가 "입력"키 누르기 지원을 찾는 다른 사람을 위해 Gloppy에서 제공 하는 바이올린에 대한 업데이트가 있습니다.

키 누르기 바인딩을위한 코드 :

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

5

IE8로 어려움을 겪는 사람을 위해 (unbind ( 'input')이 마음에 들지 않는 경우, 그에 대한 방법을 찾았습니다.

$ sniffer를 지시문에 삽입하고 다음을 사용하십시오.

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

이렇게하면 IE8이 진정됩니다. :)


또는 그냥 try / catch 사용
wired_in 2014

4

내 지식에 따르면 선택 옵션과 함께 ng-change를 사용해야하고 텍스트 상자의 경우 ng-blur를 사용해야합니다.


이것은 지금 정답입니다. 그 당시에는 질문을 받았을 때 분명히 존재하지 않았습니다.
재는 하향

대단히 감사합니다 ...이 대답해야한다
Renjith


0

기본 입력 onChange 동작 재정의 (제어 손실 포커스 및 값이 변경된 경우에만 함수 호출)

참고 : ngChange는이 포커스를 취득했을 때, 값이 지시문 저장을 요소의 값을 변경하는 동안이 이벤트를 발사 고전 OnChange 이벤트와 유사한없는
새로운 값을 변경하고 있는지 흐림 그것을 검사에 경우는 이벤트를 발생하므로

@param {String}- "onChange"가 실행되어야 할 때 호출 할 함수 이름

@example <input 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();
                    }
                }
            });
        }
    };
});

0

나는 똑같은 문제가 있었고 이것은 나를 위해 일했습니다. 추가 ng-model-update하고 ng-keyup갈 수 있습니다! 다음은 문서입니다.

 <input type="text" name="userName"
         ng-model="user.name"
         ng-change="update()"
         ng-model-options="{ updateOn: 'blur' }"
         ng-keyup="cancel($event)" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.