AngularJS에서 양식이 유효하지 않은 경우 제출 버튼 비활성화


174

나는 이런 식으로 내 양식을 가지고 있습니다 :

<form name="myForm">
    <input name="myText" type="text" ng-model="mytext" required />
    <button disabled="{{ myForm.$invalid }}">Save</button>
</form>

보시다시피, 입력이 비어 있으면 버튼이 비활성화되지만 텍스트가 포함되어 있으면 다시 활성화로 변경되지 않습니다. 어떻게 작동시킬 수 있습니까?


답변:


339

ng-disabled뿐만 아니라 양식의 이름을 사용해야합니다 . Plunker에 대한 데모는 다음과 같습니다 .

<form name="myForm">
    <input name="myText" type="text" ng-model="mytext" required />
    <button ng-disabled="myForm.$invalid">Save</button>
</form>

죄송합니다. 지금 사용하십시오. 그러나 텍스트 상자에 텍스트가 포함되어 있어도 여전히 비활성화되어 있습니다.
ali

1
+1 우연히도, 나는 당신의이 위대한 글을 읽었습니다 : benlesh.com/2012/11/angular-js-form-validation.html
Ben

양식이 없으면 어떻게합니까? div 요소에서도 그렇게 할 수 있습니까?
VsMaX

1
@MichaelCwienczek 기술적으로 ng-form을 div 태그에 추가 할 수 있습니다 : <div ng-form="myForm"> ... stuff here .. </div>. 당신이 버튼을 누름에 입력에서 값을 제출하는 경우, 나는,하지만 매우 사용하는 것이 좋습니다 <form/>는 히트에 사용자를 허용하는 것보다 다른 이유가있는 경우, 태그 [입력]하고 양식을 제출합니다. 그러나 그것은 접근성 문제와 같은 것들 때문에 더 나은 연습을 구성 할 수도 있습니다.
벤 레시

2
@ BenLesh, 제출 버튼이 양식에 없으면 양식이 유효하지 않은 경우 여전히 비활성화해야합니다.
녹색 마법사

33

이 답변에 추가하십시오. 양식 이름 (Angular 1.3)에 하이픈을 사용하면 분류가 깨질 것입니다.

따라서 이것은 작동 하지 않습니다 .

<form name="my-form">
    <input name="myText" type="text" ng-model="mytext" required />
    <button ng-disabled="my-form.$invalid">Save</button>
</form>

3
예, AngularJS 양식 유효성 검사를 위해 양식 이름이 낙타 문자 여야합니다.
dubilla

7
일반적으로 표현식과 같은 모든 js는 camelcase 형식의 객체를 인식하지만 대시는 html과 같은 구문을위한 것입니다.
ecoologic

따라서 폼이 폼셋의 멤버이므로 하이픈이있는 이름 (예 : "my_formset_name-0")이 필요한 경우 어떻게됩니까?
trubliphone

2
위의 예에서 나는 myForm.$invalid여전히 작동해야 한다고 생각 하므로 귀하의 경우에는 my_formset_name0.$invalid작동해야 한다고 생각 합니다.
wvdz

29

선택한 응답은 정확하지만 나 같은 사람은 서버 측에 요청을 보낼 때 비동기 유효성 검사에 문제가있을 수 있습니다. 요청이 처리되는 동안 버튼이 비활성화되지 않으므로 버튼이 깜박이며 사용자에게는 매우 이상하게 보입니다.

이를 무효화하려면 $ pending 상태의 양식 만 처리하면됩니다.

<form name="myForm">
  <input name="myText" type="text" ng-model="mytext" required />
  <button ng-disabled="myForm.$invalid || myForm.$pending">Save</button>
</form>

비동기 유효성 검사 솔루션에 대해 대단히 감사합니다!
Martin Brandl

!myForm.$valid비동기 보류 문제도 처리 하는 것을 사용해야 합니다. itnext.io/valid-and-invalid-inangular-forms-61cfa3f2a0cd
SavageCore

6

반응성 양식을 사용하는 경우 다음을 사용할 수 있습니다.

<button [disabled]="!contactForm.valid" type="submit" class="btn btn-lg btn primary" (click)="printSomething()">Submit</button>

2
이것은 "Angular"에 대한 유효한 조언이지만 "AngularJS"에는이 답변이 유효하지 않습니다. 즉, (click)[disabled]유효 AngularJS와 코드 아니며 반응성 양식에게 AngularJS와 프레임 워크의 일부입니다. "Angular는 오늘과 내일의 Angular의 이름입니다. AngularJS는 모든 v1.x 버전의 Angular의 이름입니다" angular.io/guide/ajs-quick-reference
dapperdan1985

1

간단한 지시문을 만들고 모든 필수 필드가 채워질 때까지 버튼을 비활성화 할 수 있습니다.

angular.module('sampleapp').directive('disableBtn',
function() {
 return {
  restrict : 'A',
  link : function(scope, element, attrs) {
   var $el = $(element);
   var submitBtn = $el.find('button[type="submit"]');
   var _name = attrs.name;
   scope.$watch(_name + '.$valid', function(val) {
    if (val) {
     submitBtn.removeAttr('disabled');
    } else {
     submitBtn.attr('disabled', 'disabled');
    }
   });
  }
 };
}
);

자세한 정보는 여기를 클릭하십시오


귀하의 솔루션 방법은 약간의 조정으로 저에게 효과적입니다. 감사합니다
Tatipaka

ng-disabled앵귤러 1.x와 [disabled]앵귤러 2 | 4.x에 이것보다 훨씬 더 나은 테스트를하는 네이티브 지시문이있을 때 왜 이렇게합니까? 두 번째로, 중첩 된 버튼을 비활성화하는 폼에 범위가 지정된 지시문이있는 이유는 매우 구체적입니다. 잘못 생각한 솔루션 IMO.
David Barker 17

위의 샘플 지시문은 원래 중첩 확인란과 같은 많은 시나리오가 있으며 모든 양식을 추가하여 HTML 코드를 어지럽히고 싶지는 않지만이 지시문은 모든 것을 처리합니다.
Prashobh

1

<form name="myForm">
        <input name="myText" type="text" ng-model="mytext" required/>
        <button ng-disabled="myForm.$pristine|| myForm.$invalid">Save</button>
</form>

좀 더 엄격하고 싶다면

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.