一种形式和许多具有不同数据的对象的验证

时间:2015-12-04 09:16:39

标签: javascript angularjs

是否可以检查该表单在js文件中是否有效,但对于许多对象?我希望html中只有一个表单,并且不使用任何ng-repeats或html中的其他循环,然后检查表单对所有对象都有效。

Exmaple

<!DOCTYPE html>
<html ng-app="AngularApp">
<head>
    <script        src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js">    </script>
      <meta charset="utf-8">
      <title>JS Bin</title>
  </head>
  <body ng-controller="mainController">
  Click on table row if u want to change data in form
  <table>
    <thead>
      <tr>
        <td>
          Index
        </td>

        <td>
          Name
        </td>
      </tr>
    </thead>

    <tbody>
      <tr ng-repeat="element in testCollection"
          ng-click="changeActiveElement(element)">
        <td>{{ $index }}</td>
        <td>{{ element.name }}</td>
      </tr>
    </tbody>
  </table>

  <br />
  <br />
  <br />

  <form name="exampleForm">
    <div class="row">
      Name [required]: <input type="text" ng-model="activeObject.name" required>
      </div>

    <div class="row">
    Phone [required]: <input type="text" ng-model="activeObject.phone" required>
    </div>

    <div class="row">
      Active: <input type="checkbox" ng-model="activeObject.active">
    </div>
  </form>

  <br />

  <button ng-disabled="">
    This button should be enable if all objects from table will pass form validation
  </button>

  but how to do this? Button should be know that every form is good or not, even if won't change object by clicking on table row.
</body>
</html>

Js:

var app = angular.module("AngularApp", []);

app.controller('mainController', function($scope) {
  $scope.testCollection = [
    {
      name: 'Mike',
      phone: 12345678,
      active: true
    },
    {
      name: 'Martin',
      phone: '',
      active: false
    },
    {
      name: 'Anna',
      phone: '',
      active: ''
    }
  ];

  $scope.activeObject = $scope.testCollection[0];

  $scope.changeActiveElement = function(element) {
    $scope.activeObject = element;
  };
});

3 个答案:

答案 0 :(得分:1)

Angular有FormController,其属性为$invalid

  

<强> $无效
  布尔
   True 如果至少有一个包含控件或表单无效。

你可以像

一样使用它
<button ng-disabled="formName.$invalid" ... >

答案 1 :(得分:1)

是的可能,所以我们可以说“很多物品”是这样的:

$scope.fianlObject = { manyObj1 : {}, manyObj2 :{}}

然后用HTML做这样的事情:

<form id="frm1" name="frm1" ng-submit="submit()">
  <div class="form-group required" ng-class="isInvalid('manyObj1', form1)">
   ....
  </div>
  <div class="form-group required" ng-class="isInvalid('manyObj2', form1)">
   ....
  </div>
  .
  .
</form>

和脚本这样的东西:

$scope.isInvalid = function (manyObj, form) {
            if (form&& form.$submitted) {
                return ( form[manyObj] && form[manyObj].$invalid) ? 'has-error'
                        : '';
                }
                return '';
            }

答案 2 :(得分:0)

是的,你可以这样做。

只需将验证器函数指定为函数,该函数只接受带有数据的普通对象并返回错误数组(如果一切正常则为空)。这个函数应该知道它所使用的上下文。

简单示例:

function validateForm(data) {
    var errors = [];
    if (data.name === 'Joe') errors.push("You can't be Joe!");
    return errors;
}

然后,每次要验证表单时,将表单数据转换为JS对象并使用该函数。此外,您可以在任何其他上下文中使用此类函数,无论谁是验证的发起者。