AngularJS:隐藏ng-message直到点击表单提交按钮

时间:2016-09-16 05:44:47

标签: angularjs ng-messages

这是在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类,因为验证错误会阻止提交表单。

我该怎么做?

由于

2 个答案:

答案 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>

并使用自定义指令。查看工作演示:

&#13;
&#13;
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;
&#13;
&#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状态中的必填字段,因此错误变得可见。 +如果您输入内容并在之后删除,则无需提交表单即可看到错误。