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.