使用AngularJS进行JSON输入验证

5

我希望对JSON输入进行验证。我知道可以通过自定义指令来实现,但我自己写不出来。现在我正在尝试使用ng-change来做。

我的HTML代码:

<div class="row">
    <div class="form-group col-xs-12">
         <label>Custom data:</label>
         <textarea class="form-control" rows="10" name="customData" ng-model="application.customDataString" ng-change="validateJSON()"></textarea>
    </div>
 </div>

我的脚本

$scope.validateJSON = function () {
        try {
            JSON.parse($scope.application.customDataString);
        } catch (e) {
            $scope.applicationForm.customData.$setValidity = false;
        }
        return true;
}

但是我遇到了一个错误:无法读取未定义的属性“$setValidity”。

1
请查看此链接 https://dev59.com/iWUp5IYBdhLWcg3wNFer#15447816 - Sibiraj
类型错误:$scope.application.customDataString.$setValidity 不是一个函数。 - taskiukas
1个回答

3

请检查这个

var app = angular.module('myApp', []);
    app.controller('mainCtrl', function($scope) {

      $scope.application = {
        customDataString: ""
      };

      $scope.validateJSON = function() {

        try {
          JSON.parse($scope.application.customDataString);
          $scope.myForm.customData.$valid = true;
          // or
          // myForm.customData.$setValidity('valid', true);
        } catch (e) {
          $scope.myForm.customData.$valid = false;
           // or
           // myForm.customData.$setValidity('valid', false);
        }
        return true;
      }

    })
<!DOCTYPE html>
<html ng-app="myApp">

<head>
  <script data-require="angular.js@1.6.5" data-semver="1.6.5" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
  <link rel="stylesheet" href="style.css" />
  <script src="script.js"></script>
</head>

<body ng-controller="mainCtrl">

  <div class="row" name="myForm" ng-form>
    <div class="form-group col-xs-12">
      <label>Custom data:</label>
      <textarea class="form-control" rows="10" name="customData" ng-form ng-model="application.customDataString" ng-change="validateJSON(myForm)"></textarea>
    </div>
  </div>
  <br>
  IS JSON VALID: {{myForm.customData.$valid}}
</body>

</html>

请检查这个Plunker。使用ng-form链接地址

现在我又遇到了一个错误: TypeError: 无法读取未定义的属性'$setValidity' - taskiukas
这可以工作,但我的表单中还有其他字段,并且只有在表单有效时才会激活提交按钮。使用这种解决方案,我无法实现这个目标。 - taskiukas
可以使用任意数量的字段。如果您不熟悉ng-form,则可以使用普通表单。 - Sibiraj
检查一下这个链接https://plnkr.co/edit/nyiYFmojgeRy9bhNA7jC?p=preview @taskiukas。两者都可以解决你的问题。 - Sibiraj
你的示例运行正常。但是现在,我有另一个问题。<p>JSON是否有效: {{applicationAddForm.customData.$valid}}</p> <p>表单是否有效{{applicationAddForm.$valid}}</p> 我输入了无效的json,然后得到false,true。json无效,但表单有效?我得到了false,true。 - taskiukas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接