AngularJS 中的日期验证
Date validation in AngularJS
我不能在 angularjs
内置的表单中允许未来的日期
这是我的 HTML:
<div ngCloak ng-app="laurelMoney" ng-controller="myCtrl">
<form name="userForm">
<div class="form-group">
<input type='date' id="trandate" class="form-control" ng-model="trandate" required ng-class="{ 'has-error' : userForm.trandate.$error }" />
<p ng-show="userForm.trandate.$error" class="help-block">Transaction can't be in future</p>
</div>
<a href="#" class="btn btn-primary btn-sm btn-block" ng-click="submitForm()" type="submit">Add Transaction</a>
</form>
而我的 javascript 是 Ñ
angular.module('laurelMoney', [])
.controller('myCtrl', function($scope) {
var today = new Date();
var dd = today.getDate();
var mm = today.getMonth() + 1;
var yyyy = today.getFullYear();
if (dd < 10) {
dd = '0' + dd
}
if (mm < 10) {
mm = '0' + mm
}
today = yyyy + '-' + mm + '-' + dd;
document.getElementById("trandate").setAttribute("max", today);
$scope.submitForm = function() {
if ($scope.userForm.$valid) {
alert('our form is amazing');
} else {
console.log("Error");
}
};
});
当日历弹出时,这工作正常。未来日期都被禁用。但我可以在日期输入框中手动将其更改为未来的日期。
系统也允许提交未来日期。这个怎么办??
谢谢。
好吧,据我从你的问题中可以理解,你只是想抛出一条错误消息或不允许用户 select 一个未来的日期,对吗?所以,给你:
备注:
- 您在 plunker 中的
Angular
版本已经完全过时,因此它可能无法像您预期的那样工作;
ngCloak
应该是 ng-cloak
;
- 您应该在
input
中添加 name attribute
以验证它;
- 此外,您可以使用
ngSubmit
来提交表单,而不是 ng-click
。
- 正如评论中指出的,如果
form
是 invalid
,您可以禁用 button
,而不是在 controller
; 中进行检查
- 最后,要将日期设置为最大日期(在您的情况下 今天),您只需执行以下操作:
$scope.max = new Date()
并在您的视图中调用它;
这是一个完整的例子:
(function() {
'use strict';
angular
.module('laurelMoney', [])
.controller('myCtrl', myCtrl);
myCtrl.$inject = ['$scope'];
function myCtrl($scope) {
$scope.max = new Date();
}
})();
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
</head>
<body ng-app="laurelMoney">
<div ng-cloak ng-controller="myCtrl">
<form name="userForm" novalidate ng-submit="submitForm()">
<div class="form-group" ng-class="{ 'has-error' : userForm.trandate.$error }">
<input type="date" name="trandate" class="form-control" required max="{{max}}" ng-model="trandate">
<p ng-if="userForm.trandate.$touched && userForm.trandate.$error.required" class="help-block">Transaction is required</p>
<p ng-if="userForm.trandate.$error.date" class="help-block">Transaction should be a valid date</p>
<p ng-if="userForm.trandate.$error.max" class="help-block">Transaction can't be in future</p>
</div>
<button type="submit" class="btn btn-primary btn-sm btn-block" ng-disabled="userForm.$invalid">Add Transaction</button>
</form>
<pre ng-bind="userForm.trandate.$error | json"></pre>
</div>
</body>
</html>
我不能在 angularjs
内置的表单中允许未来的日期这是我的 HTML:
<div ngCloak ng-app="laurelMoney" ng-controller="myCtrl">
<form name="userForm">
<div class="form-group">
<input type='date' id="trandate" class="form-control" ng-model="trandate" required ng-class="{ 'has-error' : userForm.trandate.$error }" />
<p ng-show="userForm.trandate.$error" class="help-block">Transaction can't be in future</p>
</div>
<a href="#" class="btn btn-primary btn-sm btn-block" ng-click="submitForm()" type="submit">Add Transaction</a>
</form>
而我的 javascript 是 Ñ
angular.module('laurelMoney', [])
.controller('myCtrl', function($scope) {
var today = new Date();
var dd = today.getDate();
var mm = today.getMonth() + 1;
var yyyy = today.getFullYear();
if (dd < 10) {
dd = '0' + dd
}
if (mm < 10) {
mm = '0' + mm
}
today = yyyy + '-' + mm + '-' + dd;
document.getElementById("trandate").setAttribute("max", today);
$scope.submitForm = function() {
if ($scope.userForm.$valid) {
alert('our form is amazing');
} else {
console.log("Error");
}
};
});
当日历弹出时,这工作正常。未来日期都被禁用。但我可以在日期输入框中手动将其更改为未来的日期。
系统也允许提交未来日期。这个怎么办??
谢谢。
好吧,据我从你的问题中可以理解,你只是想抛出一条错误消息或不允许用户 select 一个未来的日期,对吗?所以,给你:
备注:
- 您在 plunker 中的
Angular
版本已经完全过时,因此它可能无法像您预期的那样工作; ngCloak
应该是ng-cloak
;- 您应该在
input
中添加 nameattribute
以验证它; - 此外,您可以使用
ngSubmit
来提交表单,而不是ng-click
。 - 正如评论中指出的,如果
form
是invalid
,您可以禁用button
,而不是在controller
; 中进行检查
- 最后,要将日期设置为最大日期(在您的情况下 今天),您只需执行以下操作:
$scope.max = new Date()
并在您的视图中调用它;
这是一个完整的例子:
(function() {
'use strict';
angular
.module('laurelMoney', [])
.controller('myCtrl', myCtrl);
myCtrl.$inject = ['$scope'];
function myCtrl($scope) {
$scope.max = new Date();
}
})();
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
</head>
<body ng-app="laurelMoney">
<div ng-cloak ng-controller="myCtrl">
<form name="userForm" novalidate ng-submit="submitForm()">
<div class="form-group" ng-class="{ 'has-error' : userForm.trandate.$error }">
<input type="date" name="trandate" class="form-control" required max="{{max}}" ng-model="trandate">
<p ng-if="userForm.trandate.$touched && userForm.trandate.$error.required" class="help-block">Transaction is required</p>
<p ng-if="userForm.trandate.$error.date" class="help-block">Transaction should be a valid date</p>
<p ng-if="userForm.trandate.$error.max" class="help-block">Transaction can't be in future</p>
</div>
<button type="submit" class="btn btn-primary btn-sm btn-block" ng-disabled="userForm.$invalid">Add Transaction</button>
</form>
<pre ng-bind="userForm.trandate.$error | json"></pre>
</div>
</body>
</html>