这是在AngularJS(1.x)中使用ng-messages的典型示例:
<form name="demoForm">
<input name="amount" type="number" ng-model="amount" max="100" required>
<div ng-messages="demoForm.amount.$error">
<div ng-message="required">This field is required</div>
</div>
<button type="submit">test submit</button>
</form>
请参阅:http://jsfiddle.net/11en8swy/3/
我现在想要更改此示例,因此&#34;此字段是必需的&#34;错误仅在触摸字段时显示($touched
)或,用户点击提交按钮。
我无法在表单上使用ng-submitted
类,因为验证错误会阻止提交表单。
我该怎么做?
由于
答案 0 :(得分:1)
您可以使用ng-show
:
<div ng-messages="demoForm.amount.$error" ng-show="demoForm.amount.$touched">
<div ng-message="required">This field is required</div>
</div>
并使用自定义指令。查看工作演示:
var app = angular.module('app', ['ngMessages']);
app.controller('mainCtrl', function($scope) {
});
app.directive('hasFocus', function($timeout) {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, ctrl) {
element.on('focus', function() {
$timeout(function() {
ctrl.hasFocusFoo = true;
})
});
element.on('blur', function() {
$timeout(function() {
ctrl.hasFocusFoo = false;
})
});
}
}
})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular-messages.js"></script>
<body ng-app="app" ng-controller="mainCtrl">
<form name="demoForm">
<input name="amount" type="number" ng-model="amount" max="100" required has-focus>
<div ng-messages="demoForm.amount.$error" ng-show="demoForm.amount.$touched || demoForm.amount.hasFocusFoo">
<div ng-message="required">This field is required</div>
</div>
<button type="submit">test submit</button>
</form>
</body>
&#13;
该指令基本上是在ngModel控制器上设置另一个hasFocusFoo
字段,然后我们可以轻松地使用该指令。
答案 1 :(得分:0)
啊,最后在电脑上。
https://plnkr.co/edit/EX3UmoAOKmTKlameBXRa?p=preview
<form name="mc.form">
<input type="text" name="empty" ng-model="mc.empty" required />
<label ng-show="mc.form.empty.$dirty && mc.form.empty.$error.required">i'm empty</label>
</form>
MainController.$inject = ['$timeout'];
function MainController($timeout) {
var vm = this;
$timeout(function(){
vm.form.$setPristine();
});
vm.submit = function(){
if(vm.form.$valid){
alert('yay');
}else{
(vm.form.$error.required || []).forEach(function(f){
f.$dirty = true;
});
}
}
}
以下是我在解决方案中处理此任务的方法。 form。$ setPristine() - 将字段设置为pristine
状态,因此字段不是$dirty
并且隐藏了错误。但提交后,我手动声明$dirty
状态中的必填字段,因此错误变得可见。 +如果您输入内容并在之后删除,则无需提交表单即可看到错误。