以编程方式将所有表单字段设置为表单提交上的ng-touch

Der*_*rek 32 javascript validation twitter-bootstrap angularjs

HTML:

<div class="form-group" 
     ng-class="{ 'has-error' : form.firstName.$invalid && form.firstName.$touched }">
  <label for="firstName" 
         class="control-label">
         First Name
  </label>
  <input type="text" 
         name="firstName" 
         id="firstName" 
         ng-model="editableUser.firstName" 
         class="form-control" 
         required>
  <span class="help-block" 
        ng-show="form.firstName.$error.required && form.firstName.$touched">
        First Name is required
  </span>
</div>

<input type="submit" 
       ng-click="submit()" 
       value="Submit" 
       class="btn btn-default">
Run Code Online (Sandbox Code Playgroud)

当用户点击提交时,我正试图让我的'has-error'类启动无效字段.

我认为你可以这样做:

$scope.submit = function () {
  if ($scope.form.$invalid) {
    angular.forEach($scope.form.$invalid, function(field) {
      field.$setTouched();
    });
    alert("Form is invalid.");
  }
};
Run Code Online (Sandbox Code Playgroud)

https://docs.angularjs.org/api/ng/type/form.FormController中没有$setTouched方法

编辑: Realize $setTouched确实存在,它位于https://docs.angularjs.org/api/ng/type/ngModel.NgModelController

Ale*_*nov 53

if ($scope.form.$invalid) {
    angular.forEach($scope.form.$error, function (field) {
        angular.forEach(field, function(errorField){
            errorField.$setTouched();
        })
    });
    alert("Form is invalid.");
}
Run Code Online (Sandbox Code Playgroud)

plunker:http://plnkr.co/edit/XmvoTkIQ0yvFukrVSz11


hen*_*eee 16

试试最近添加的$ submit

<input type="text" 
     name="firstName" 
     id="firstName" 
     ng-model="editableUser.firstName" 
     class="form-control" 
     required>
   <span class="help-block" 
    ng-show="form.firstName.$error.required && (form.firstName.$touched || form.$submitted">
    First Name is required
Run Code Online (Sandbox Code Playgroud)

  • 另外 - 如果你的函数是由一个锚元素而不是一个提交类型的输入触发的 - 你可能想要将`$ scope.myForm.$ setSubmitted();`添加到你的函数中. (6认同)

Kla*_*r_1 7

扩展Alexey的答案,你可以向FormController添加新的方法来执行相同的操作,因此不需要将代码从一个提交函数复制到另一个提交函数:

// config.js
export default function config($provide) {
    $provide.decorator('formDirective', $delegate => {
        const fn = $delegate[0].controller.prototype
        if (!('$setTouched' in fn)) fn.$setTouched = function() {
            if (this.$invalid) {
                Object.values(this.$error).forEach(controls => {
                    controls.forEach(control => control.$setTouched())
                })
            }
        }
        return $delegate
    })
}
Run Code Online (Sandbox Code Playgroud)
// controller.js
$scope.submit = function () {
    if ($scope.form.$invalid) {
        $scope.form.$setTouched();
        alert("Form is invalid.");
    }
};
Run Code Online (Sandbox Code Playgroud)

如果有人想知道为什么有人想要进行这种验证:缺少iOS约束验证,因此ng-submit即使在无效表单上也会调用.