입력 유효성 검사가 실패 할 때 Angularjs가 양식 제출을 방지


155

클라이언트 측 입력 유효성 검사와 함께 angularjs를 사용하여 간단한 로그인 양식을 작성하여 사용자 이름과 암호가 비어 있지 않고 3 자보다 길지 않은지 확인하고 있습니다. 아래 코드를 참조하십시오 :

<form name="loginform" novalidate ng-submit="login.submit()" class="css-form">
    <fieldset>

        <div class="control-group input-prepend">
            <span class="add-on"><i class="icon-user"></i></span>
            <input type="text" ng-model="login.username" name="username" required ng-minlength="3" placeholder="username" />
        </div>

        <div class="control-group input-prepend">
            <span class="add-on"><i class="icon-lock"></i></span>
            <input type="password" ng-model="login.password" name="password" required ng-minlength="3" placeholder="" />
        </div>

        <div class="control-group">
            <input class="btn" type="submit" value="Log in">
        </div>

    </fieldset>
</form>

그리고 컨트롤러 :

var controller = function($scope) {

    $scope.login = {
        submit: function() {

            Console.info($scope.login.username + ' ' + $scope.login.password);
        }
    }

};

문제는 login.submit입력이 유효하지 않더라도 함수가 호출 된다는 것입니다. 이 행동을 막을 수 있습니까?

참고로 부트 스트랩과 requirejs도 사용한다고 언급 할 수 있습니다.



양식 태그없이 사용할 수 있으며 form.valid는 ng-click에서 작동합니다!
Rizwan Patel

답변:


329

넌 할 수있어:

<form name="loginform" novalidate ng-submit="loginform.$valid && login.submit()">

컨트롤러 점검이 필요 없습니다.


8
이것이 정답입니다. 컨트롤러에서 아무것도 확인할 필요가 없습니다
Howie

10
"컨트롤러 점검 필요 없음"에 동의하지 않습니다. 제출 기능에서 추가 유효성 검사를 수행 한 경우 어떻게됩니까?
SlaterCodes

6
지시문에서 추가 검증을 수행하십시오. $ setValidity로 유효성 검사를 업데이트하십시오.
TMB

@ b1tsh1ft 제출시 알아내는 것이 아니라 항상 현재의 유효성 상태를 알고있는 것이 좋습니다. 그것은 일종의 각도 검증의 요점입니다. 스코프가 알 수없는 경우 유효하지 않은 상태를 시각적으로 표시 할 수 없습니다.
Kevin Beal

1
나는이 접근법을 시도했지만 두 가지 모두를 평가하는 것으로 보인다 (즉 &&, 제출의 일부로 값을 전달하려고 시도한 후 부울을 단락시키지 않고 값 자체가 "거짓"임을 확인한 경우
Archimedes Trajano

67

제출 단추를 다음으로 변경하십시오.

<button type="submit" ng-disabled="loginform.$invalid">Login</button>

1
좋은 대답입니다. 당신은 바위!
Harsha. Vaswani

24
입력 필드에 포커스가있는 동안 Enter 키를 누르면 양식을 제출할 수 있습니다.
fabsenet

2
@Red : 위의 주석을 참조하십시오.
Andrei Rînea

일반적으로 버튼을 비활성화하면이 문제를 해결하는 가장 좋은 방법이지만 OP가 요청한 것은 아닙니다.
downhand

1
이 기술을 결합하여 양식 제출을 방지하기 위해 @Yashua 답변과 함께 사용자에게 시각적 피드백을 제공합니다. 감사!
tkarls

43

따라서 TheHippo의 제안 된 답변이 저에게 효과적이지 않은 대신 양식을 매개 변수로 함수에 다음과 같이 전송했습니다.

<form name="loginform" novalidate ng-submit="login.submit(loginForm)" class="css-form">

이렇게하면 컨트롤러 방식에서 양식을 사용할 수 있습니다.

$scope.login = {
    submit : function(form) {
        if(form.$valid)....
    }

나는 같은 문제가 있었다. 그래도 귀하의 방법을 사용했습니다.
Panda4Man

form. $ valid 검사는 HTML이 아닌 JS에서 수행되기 때문에 이것은 Accepted Answer보다 약간 낫습니다.
cellepo

그러나 loginForm을 전달하여 함수를 제출할 필요는 없다고 생각합니다. JS에서 $ scope.loginform을 사용할 수 있어야한다고 생각합니다 (적어도 나에게는 가능했습니다). 유효합니다.
cellepo

13

양식은 자동으로 $ scope에 객체로 배치됩니다. 그것은 통해 액세스 할 수 있습니다$scope[formName]

아래는 ng-submit에서 매개 변수로 양식 자체를 전달하지 않고 원래 설정에서 작동하는 예제입니다.

var controller = function($scope) {

    $scope.login = {
        submit: function() {
            if($scope.loginform.$invalid) return false;

        }
    }

};

작업 예 : http://plnkr.co/edit/BEWnrP?p=preview


4
$ scope 대신 "As Controller"표기법을 사용하면 양식에 어떻게 액세스합니까?
masimplo

@masimakopoulos : if(this.loginform.$invalid)..을 대신 사용할 수 있지만 HTML에서는 양식에 이름을 지정해야 <form name="ctrl.loginform" ..합니다. 그리고 그것은 <div ng-controller="controller as ctrl"..컨트롤러로 구문을 사용한다고 가정 합니다. 감사합니다 @JoshCaroll
Bart

13

HTML :

<div class="control-group">
    <input class="btn" type="submit" value="Log in" ng-click="login.onSubmit($event)">
</div>

컨트롤러에서 :

$scope.login = {
    onSubmit: function(event) {
        if (dataIsntValid) {
            displayErrors();
            event.preventDefault();
        }
        else {
            submitData();
        }
    }
}

onsubmit 메소드 내에서 확인해야합니까? 이것은 입력이 마크 업 (각도를 통해)과 js 코드 모두에서 모든 기준을 충족하는지 확인해야 함을 의미합니다. 내 의견으로는 각도가 입력이 유효하지 않을 때 onsubmit을 호출해서는 안됩니다. 참조 benlesh.com/2012/11/angular-js-form-validation.html 에 "NG 제출 전체 양식이 $ 유효 할 때까지 호출 할 수 없습니다"라는
Runar Halse

양식이 유효한 경우 제출을 허용하지 않도록 버튼을 비활성화 할 수도 있습니다. ng-submit 양식을 사용할 수도 있습니다. 각도가 양식 유효성 검사를 처리하지 않으면 event.preventDefault()양식 제출을 중지하는 방법입니다.
TheHippo

@RunarHalse 실제로 확인이 필요합니다. 나는 이것이 그렇게해서는 안된다는 것에 동의합니다. 링크 된 예제에서 onsubmit 메소드가 호출되지 않는 이유는 해당 예제에 novalidate 세트가 없기 때문입니다. 브라우저가 Angular가 아니라 이벤트가 발생하지 못하게합니다. : 여기에 / nobalidate w 그 예이다 plnkr.co/edit/R0C8XA?p=preview는 . 양식이 제출됩니다.
davidmdem

내가 찾던 것을 완벽하게, 각도를 사용하여 양식 제출을 차단하는 방법
setebos

3

OPs 질문에 대한 직접적인 해결책은 아니지만 양식이 ng-app컨텍스트 내에 있지만 Angular가 완전히 무시하도록하려면 ngNonBindable지시문을 사용하여 명시 적 으로이 작업을 수행 할 수 있습니다 .

<form ng-non-bindable>
  ...
</form>

2

위의 답변에 추가하면

아래와 같이 2 개의 일반 버튼이 있습니다. (어딘가에 type = "submit"없음)

<button ng-click="clearAll();" class="btn btn-default">Clear Form</button>
<button ng-disabled="form.$invalid" ng-click="submit();"class="btn btn-primary pull-right">Submit</button>

아무리 노력해도 양식이 유효하면 Enter 키를 누릅니다 "양식 지우기"단추가 호출되어 전체 양식이 지워집니다.

해결 방법으로

비활성화되고 숨겨진 더미 제출 버튼을 추가해야했습니다. 그리고이 더미 버튼은 아래 그림과 같이 다른 모든 버튼 위에 있어야했습니다 .

<button type="submit" ng-hide="true" ng-disabled="true">Dummy</button>

<button ng-click="clearAll();" class="btn btn-default">Clear Form</button>

<button ng-disabled="form.$invalid" ng-click="submit();"class="btn btn-primary pull-right">Submit</button>

글쎄, 내 의도는 Enter를 제출하지 않았으므로 위의 해킹은 정상적으로 작동합니다.


당신은 또한 당신의 양식에서 on ng-submit 속성을 제거함으로써 언론의 입력에 제출을 중지 할 수 있습니다
Kieran

1

나는 이것이 오래된 실이라는 것을 알고 있지만 나는 또한 기여할 것이라고 생각했다. 내 솔루션은 이미 답변으로 표시된 게시물과 유사합니다. 일부 인라인 JavaScript 검사는 트릭을 수행합니다.

ng-click="form.$invalid ? alert('Please correct the form') : saveTask(task)"

1
입력 필드에 포커스가있는 동안 Enter 키를 누르면 양식을 제출할 수 있습니다.
Yevgeniy Afanasyev

0

나는 그것이 늦었고 응답을 받았음을 알고 있지만, 내가 만든 깔끔한 것들을 공유하고 싶습니다. 양식의 onsubmit을 연결하는 ng-validate 지시문을 작성한 다음 $ eval이 false 인 경우 prevent-default를 발행합니다.

app.directive('ngValidate', function() {
  return function(scope, element, attrs) {
    if (!element.is('form'))
        throw new Error("ng-validate must be set on a form elment!");

    element.bind("submit", function(event) {
        if (!scope.$eval(attrs.ngValidate, {'$event': event}))
            event.preventDefault();
        if (!scope.$$phase)
            scope.$digest();            
    });
  };
});

귀하의 HTML에서 :

<form name="offering" method="post" action="offer" ng-validate="<boolean expression">
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.