제출 시 또는 사용자 입력 시에만 양식 필드 확인
다음을 사용하여 검증된 양식 필드가 있습니다.required문제는 폼이 렌더링되면 바로 오류가 표시된다는 것입니다.사용자가 텍스트 필드에 실제로 입력한 후 또는 제출 시에만 표시되도록 합니다.
어떻게 구현하면 좋을까요?
사용하다$dirty사용자가 입력과 상호 작용한 후에만 오류를 표시하는 플래그:
<div>
<input type="email" name="email" ng-model="user.email" required />
<span ng-show="form.email.$dirty && form.email.$error.required">Email is required</span>
</div>
사용자가 양식을 제출한 후에만 오류를 트리거하려면 다음과 같이 별도의 플래그 변수를 사용할 수 있습니다.
<form ng-submit="submit()" name="form" ng-controller="MyCtrl">
<div>
<input type="email" name="email" ng-model="user.email" required />
<span ng-show="(form.email.$dirty || submitted) && form.email.$error.required">
Email is required
</span>
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
function MyCtrl($scope){
$scope.submit = function(){
// Set the 'submitted' flag to true
$scope.submitted = true;
// Send the form to server
// $http.post ...
}
};
그리고 안에 있는 JS가ng-show표현이 너무 과해 보이므로 다른 방법으로 추상화할 수 있습니다.
function MyCtrl($scope){
$scope.submit = function(){
// Set the 'submitted' flag to true
$scope.submitted = true;
// Send the form to server
// $http.post ...
}
$scope.hasError = function(field, validation){
if(validation){
return ($scope.form[field].$dirty && $scope.form[field].$error[validation]) || ($scope.submitted && $scope.form[field].$error[validation]);
}
return ($scope.form[field].$dirty && $scope.form[field].$invalid) || ($scope.submitted && $scope.form[field].$invalid);
};
};
<form ng-submit="submit()" name="form">
<div>
<input type="email" name="email" ng-model="user.email" required />
<span ng-show="hasError('email', 'required')">required</span>
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
양식 제출 시 오류 메시지를 표시하려면 조건을 사용할 수 있습니다.form.$submitted폼의 송신 시도 여부를 확인합니다.다음 예를 확인합니다.
<form name="myForm" novalidate ng-submit="myForm.$valid && createUser()">
<input type="text" name="name" ng-model="user.name" placeholder="Enter name of user" required>
<div ng-messages="myForm.name.$error" ng-if="myForm.$submitted">
<div ng-message="required">Please enter user name.</div>
</div>
<input type="text" name="address" ng-model="user.address" placeholder="Enter Address" required ng-maxlength="30">
<div ng-messages="myForm.name.$error" ng-if="myForm.$submitted">
<div ng-message="required">Please enter user address.</div>
<div ng-message="maxlength">Should be less than 30 chars</div>
</div>
<button type="submit">
Create user
</button>
</form>
angularjs 형태 상태를 사용할 수 있습니다.form.$submitted.처음에는form.$submitted가치가 있다false그리고 유언은true폼이 정상적으로 송신된 후.
에릭 아이그너
$dirty(필드가 수정되었습니다) 및 $invalid(필드 내용이 유효하지 않습니다)를 사용하십시오.
각도 형태 검증에 대한 아래 예를 확인하십시오.
1)
사용자 입력용 HTML 검증 예:
<form ng-app="myApp" ng-controller="validateCtrl" name="myForm" novalidate>
<p>Email:<br>
<input type="email" name="email" ng-model="email" required>
<span ng-show="myForm.email.$dirty && myForm.email.$invalid">
<span ng-show="myForm.email.$error.required">Email is required.</span>
<span ng-show="myForm.email.$error.email">Invalid email address.</span>
</span>
</p>
</form>
2)
사용자 제출의 HTML/J 검증 예:
<form ng-app="myApp" ng-controller="validateCtrl" name="myForm" novalidate form-submit-validation="">
<p>Email:<br>
<input type="email" name="email" ng-model="email" required>
<span ng-show="submitted || myForm.email.$dirty && myForm.email.$invalid">
<span ng-show="myForm.email.$error.required">Email is required.</span>
<span ng-show="myForm.email.$error.email">Invalid email address.</span>
</span>
</p>
<p>
<input type="submit">
</p>
</form>
커스텀 디렉티브:
app.directive('formSubmitValidation', function () {
return {
require: 'form',
compile: function (tElem, tAttr) {
tElem.data('augmented', true);
return function (scope, elem, attr, form) {
elem.on('submit', function ($event) {
scope.$broadcast('form:submit', form);
if (!form.$valid) {
$event.preventDefault();
}
scope.$apply(function () {
scope.submitted = true;
});
});
}
}
};
})
3)
다음과 같은 ng-change 명령어를 사용하고 싶지 않습니다.
<form ng-app="myApp" ng-controller="validateCtrl" name="myForm" novalidate ng-change="submitFun()">
<p>Email:<br>
<input type="email" name="email" ng-model="email" required>
<span ng-show="submitted || myForm.email.$dirty && myForm.email.$invalid">
<span ng-show="myForm.email.$error.required">Email is required.</span>
<span ng-show="myForm.email.$error.email">Invalid email address.</span>
</span>
</p>
<p>
<input type="submit">
</p>
</form>
컨트롤러 SubmitFun() JS:
var app = angular.module('example', []);
app.controller('exampleCntl', function($scope) {
$scope.submitFun = function($event) {
$scope.submitted = true;
if (!$scope.myForm.$valid)
{
$event.preventDefault();
}
}
});
폼 요소에 대한 유효성 검사 호출은 이 요소에 대한 변경 이벤트를 트리거하여 처리할 수 있습니다.
a) 예: 형식의 분리된 요소에 변화를 유발합니다.
$scope.formName.elementName.$$element.change();
b) 예: 각 폼 요소에 대한 변경 이벤트를 트리거합니다.예를 들어 ng-click, ng-click, ng-click...
vm.triggerChangeForFormElements = function() {
// trigger change event for each of form elements
angular.forEach($scope.formName, function (element, name) {
if (!name.startsWith('$')) {
element.$$element.change();
}
});
};
c) 또 하나의 방법
var handdleChange = function(form){
var formFields = angular.element(form)[0].$$controls;
angular.forEach(formFields, function(field){
field.$$element.change();
});
};
언급URL : https://stackoverflow.com/questions/17452247/validate-form-field-only-on-submit-or-user-input
'source' 카테고리의 다른 글
| templateUrl을 즉시 변경할 수 있습니까? (0) | 2023.02.11 |
|---|---|
| AngularJS: Reverse 체크박스 상태 (0) | 2023.02.11 |
| Angular의 $q.reject() 대 지연.거부() (0) | 2023.02.11 |
| ng-show 후 입력 필드에 포커스 설정 (0) | 2023.02.11 |
| WordPress.com에서 호스팅되는 WordPress 블로그에 구문 강조 표시를 추가하려면 어떻게 해야 합니까? (0) | 2023.02.07 |