수색…


기본 양식 유효성 검사

Angular의 장점 중 하나는 클라이언트 측 폼 유효성 검사입니다.

전통적인 양식 입력을 처리하고 질의 (interrogative) jQuery 스타일 처리를 사용하는 것은 시간 소모적이고 까다 롭습니다. Angular를 사용하면 전문적인 대화 형 양식을 비교적 쉽게 만들 수 있습니다.

ng-model 지정 문은 입력 필드와 양방향 바인딩을 제공하며 일반적으로 novalidate 속성은 양식 요소에 배치되어 브라우저가 원시 유효성 검증을 수행하지 못하게합니다.

따라서, 간단한 폼은 다음과 같습니다.

<form name="form" novalidate>
  <label name="email"> Your email </label>
  <input type="email" name="email" ng-model="email" />
</form>

Angular가 입력의 유효성을 검사하려면 범위에서 바인딩 할 변수를 지정하기 위해 ng-model 속성을 추가하는 것을 제외하고는 일반 입력 요소와 똑같은 구문을 사용합니다. 전자 메일은 이전 예제에 나와 있습니다. 숫자의 유효성을 검사하는 구문은 다음과 같습니다.

<input type="number" name="postalcode" ng-model="zipcode" />

기본 양식 유효성 검사의 마지막 단계는 기본 양식 제출이 수행되는 것을 허용하는 대신 ng-submit을 사용하여 컨트롤러에서 양식 제출 기능에 연결하는 것입니다. 이것은 필수는 아니지만 입력 변수가 이미 범위에서 사용 가능하며 제출 기능에서 사용할 수 있으므로 일반적으로 사용됩니다. 또한 일반적으로 양식에 이름을 지정하는 것이 좋습니다. 이러한 변경으로 인해 다음과 같은 구문이 나타납니다.

<form name="signup_form" ng-submit="submitFunc()" novalidate>
  <label name="email"> Your email </label>
  <input type="email" name="email" ng-model="email" />
  <button type="submit">Signup</button>
</form>

위의 코드는 작동하지만 Angular가 제공하는 다른 기능이 있습니다.

다음 단계는 Angular가 폼 처리에 ng-pristine , ng-dirty , ng-validng-invalid 를 사용하여 클래스 속성을 첨부한다는 것을 이해하는 것입니다. CSS에서 이러한 클래스를 사용하면 유효 / 무효원시 / 더티 입력 필드의 스타일을 지정하고 사용자가 양식에 데이터를 입력 할 때 프레젠테이션을 변경할 수 있습니다.

양식 및 입력 상태

각도 양식 및 입력에는 내용 유효성을 검사 할 때 유용한 다양한 상태가 있습니다.

입력 상태

상태 기술
$touched 입력란을 터치했습니다.
$untouched 입력란에 손을 대지 않았습니다.
$pristine 필드가 수정되지 않았습니다.
$dirty 필드가 수정되었습니다.
$valid 필드 내용이 유효합니다.
$invalid 입력란 내용이 잘못되었습니다.

위의 모든 상태는 부울 속성이며 true 또는 false 일 수 있습니다.

이를 통해 사용자에게 메시지를 표시하는 것이 매우 쉽습니다.

<form name="myForm" novalidate>
    <input name="myName" ng-model="myName" required>
    <span ng-show="myForm.myName.$touched && myForm.myName.$invalid">This name is invalid</span>
</form>

여기서는 ng-show 지시문을 사용하여 양식을 수정했지만 유효하지 않은 경우 사용자에게 메시지를 표시합니다.

CSS 클래스

Angular는 양식 및 입력에 대한 상태에 따라 CSS 클래스를 제공합니다.

수업 기술
ng-touched 입력란을 터치했습니다.
ng-untouched 입력란에 손을 대지 않았습니다.
ng-pristine 필드가 수정되지 않았습니다.
ng-dirty 필드가 수정되었습니다.
ng-valid 필드가 유효합니다.
ng-invalid 입력란이 잘못되었습니다.

이 클래스를 사용하여 양식에 스타일을 추가 할 수 있습니다.

input.ng-invalid {
  background-color: crimson;
}
input.ng-valid {
  background-color: green;
}

ngMessages

ngMessages 는 유효성 검사 메시지를보기에 표시하기위한 스타일을 향상시키는 데 사용됩니다.

전통적 접근법

ngMessages 하기 전에 일반적으로 ng-class 사전 정의 된 지시문을 사용하여 유효성 검사 메시지를 표시합니다.이 접근법은 ngMessages repetitive 작업이었습니다.

이제 ngMessages 를 사용하여 자체적 인 맞춤 메시지를 만들 수 있습니다.

Html :

<form name="ngMessagesDemo">
  <input name="firstname" type="text" ng-model="firstname" required>
  <div ng-messages="ngMessagesDemo.firstname.$error">
    <div ng-message="required">Firstname is required.</div>
  </div>
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.16/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.16/angular-messages.min.js"></script>

JS :

var app = angular.module('app', ['ngMessages']);

app.controller('mainCtrl', function ($scope) { 
    $scope.firstname = "Rohit";
});

사용자 지정 양식 유효성 검사

어떤 경우에는 기본적인 검증만으로는 충분하지 않습니다. ngModelController$validators 객체에 $validators 검사기 기능을 추가하는 각도 지원 맞춤 검사 :

angular.module('app', [])
  .directive('myValidator', function() {
    return {
      // element must have ng-model attribute
      // or $validators does not work
      require: 'ngModel',
      link: function(scope, elm, attrs, ctrl) {
        ctrl.$validators.myValidator = function(modelValue, viewValue) {
            // validate viewValue with your custom logic
            var valid = (viewValue && viewValue.length > 0) || false;
            return valid; 
        };
      } 
    };

유효성 검사기는 ngModel 을 필요로하는 지시문으로 정의되므로 유효성 검사기를 적용하려면 사용자 지정 문을 입력 양식 컨트롤에 추가하면됩니다.

<form name="form">
  <input type="text" 
         ng-model="model" 
         name="model" 
         my-validator>
  <pre ng-bind="'my-validator returned: ' + form.model.$valid"></pre>
</form> 

그리고 my-validator 는 기본 폼 컨트롤에 적용 할 필요가 없습니다. 그것의 속성에 ng-model 이라면 어떤 요소라도 될 수 있습니다. 일부 사용자 정의 빌드 UI 구성 요소가있는 경우에 유용합니다.

예

중첩 된 양식

때로는 페이지에 컨트롤과 입력을 논리적으로 그룹화하기 위해 양식을 중첩하는 것이 바람직합니다. 그러나 HTML5 양식은 중첩되어서는 안됩니다. 각도 공급은 대신에 ng-form 합니다.

<form name="myForm" noValidate>
  <!-- nested form can be referenced via 'myForm.myNestedForm' -->
  <ng-form name="myNestedForm" noValidate>
    <input name="myInput1" ng-minlength="1" ng-model="input1" required />
    <input name="myInput2" ng-minlength="1" ng-model="input2" required />
  </ng-form>

  <!-- show errors for the nested subform here -->
  <div ng-messages="myForm.myNestedForm.$error">
    <!-- note that this will show if either input does not meet the minimum -->
    <div ng-message="minlength">Length is not at least 1</div>
  </div>
</form>

<!-- status of the form -->
<p>Has any field on my form been edited? {{myForm.$dirty}}</p>
<p>Is my nested form valid? {{myForm.myNestedForm.$valid}}</p>
<p>Is myInput1 valid? {{myForm.myNestedForm.myInput1.$valid}}</p>

양식의 각 부분은 전체 양식의 상태에 영향을줍니다. 따라서 입력 중 하나 인 myInput1 이 편집되고 $dirty 이면 해당 포함 양식도 $dirty 됩니다. 이것은 각각의 폼을 포함하고 있기 때문에 myNestedFormmyForm 은 모두 $dirty 됩니다.

비동기 유효성 검사기

비동기 유효성 검사기를 사용하면 백엔드에 대한 양식 정보의 유효성을 검사 할 수 있습니다 ($ http 사용).

이러한 종류의 유효성 검사기는 사용자 테이블 및 기타 데이터베이스 정보와 같은 다양한 이유로 사용자 클라이언트에서 가질 수없는 서버 저장 정보에 액세스해야 할 때 필요합니다.

비동기 유효성 검사기를 사용하려면 inputng-model 에 액세스하고 $asyncValidators 속성에 대한 콜백 함수를 정의합니다.

예:

다음 예제는 제공된 이름이 이미 존재하는지 확인하고, 이름이 이미 있거나 제공되지 않은 경우 약속을 거부하는 상태를 백엔드가 반환합니다. 이름이 존재하지 않으면 해결 된 약속이 반환됩니다.

ngModel.$asyncValidators.usernameValidate = function (name) {               
     if (name) {
          return AuthenticationService.checkIfNameExists(name); // returns a promise
     } else {
          return $q.reject("This username is already taken!"); // rejected promise
     }
};

이제 입력의 ng-model 이 변경 될 때마다이 함수가 실행되어 결과와 함께 약속을 반환합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow