我有一个表格需要验证.
该表单包含许多部分,其中一些默认情况下禁用.每个字段中的值是正确的,但是它违反了我的验证指令.例如,当它被禁用时,它应该包含0,但是当它可编辑时,它应该包含其他东西.无论如何,我附加一个禁用指令给他们,并把它们放下.
当我提交我的表单(使用角度范围函数),如果($scope.sarfaslForm.$invalid) – >返回true.它表示当我检查$scope.sarfaslForm.$错误列表时,我有两个无效字段.
跟随这个博客我实现我的验证:
http://blog.yodersolutions.com/bootstrap-form-validation-done-right-in-angularjs/
而在this thread之后,我创建一个指令来忽略我的一些禁用控制:
我对此指令进行了微小的修改:
- .directive('hsDisableValidation',function() {
- return {
- require: '^form',restrict: 'A',link: function(scope,element,attrs,form) {
- var control;
- scope.$watch(function() {
- return scope.$eval(attrs.hsDisableValidation);
- },function(value) {
- if (!control) {
- control = form[element[0].name];
- //form[element.find("input").attr("name")];
- }
- if (value === false) {
- form.$addControl(control);
- angular.forEach(control.$error,function(validity,validationToken) {
- form.$setValidity(validationToken,!validity,control);
- });
- } else {
- form.$removeControl(control);
- //In Here: I tried to $setValidity of controls to true,Remove Error List,and Remove Validator Function,but these things didn't worked out
- }
- });
- }
- }
- })
这里验证对我来说总是失败:
PS:由于我在“文本”类型字段上使用它,我没有最小/最大值,只有最小/最大长度.我确定这不是问题,但我正在包括这个代码来确保.
- .directive('hsMinValue',function() {
- return {
- require: 'ngModel',link: function (scope,elem,attr,ngModel) {
- function isLesser(value) {
- var minVal = parseInt(attr.hsMinValue);
- return parseInt(value) < minVal;
- }
- function validate(value) {
- var valid = !isLesser(value);
- ngModel.$setValidity('minValue',valid);
- return valid ? value : undefined;
- }
- ngModel.$parsers.unshift(function (value) {
- ngModel.$setValidity('minValue',!isLesser(value));
- return value;
- });
- ngModel.$formatters.unshift(function (value) {
- ngModel.$setValidity('minValue',!isLesser(value));
- return value;
- });
- }
- }
- });
然后我保存:
- saveSarfasl: function () {
- $scope.$broadcast('show-errors-check-validity');
- if ($scope.sarfaslForm.$invalid) { --> True :|
- return;
- }
- //Stuffs
- }
编辑:请求詹姆斯,我把HTML
和我的页面的视图在这里.
- <div class="clearfix">
- <form name="sarfaslForm" novalidate>
- <table class="table-condensed">
- <tbody>
- <tr>
- <td>
- کد سرفصل
- </td>
- <td>
- <table class="table-condensed">
- <tbody>
- <tr>
- <td data-ng-if="View.FinYear.LenK != 0">
- کل
- </td>
- <td data-ng-if="View.FinYear.LenM != 0">
- معین
- </td>
- <td data-ng-if="View.FinYear.LenT1 != 0">
- تفضیل یک
- </td>
- <td data-ng-if="View.FinYear.LenT2 != 0">
- تفضیل دو
- </td>
- <td data-ng-if="View.FinYear.LenJ != 0">
- جزء
- </td>
- </tr>
- <tr>
- <td data-ng-if="View.FinYear.LenK != 0">
- <div class="form-group" hs-show-errors hs-show-success>
- <input name="CodKol" type="text" hs-restrict-pattern="[^\d]*" maxlength="{{View.FinYear.LenK}}"
- class="form-control input-sm"
- data-ng-model="View.Kol" data-ng-disabled="View.Level!==1"
- data-ng-blur="Events.codeChanged('k')"
- data-ng-change="Events.setSarfaslCod()"
- hs-disable-validation="View.Level!==1"
- data-ng-required="true"
- hs-min-value="1" />
- <p class="help-block" ng-if="sarfaslForm.CodKol.$error.required">
- کد کل الظامی می باشد
- </p>
- <p class="help-block" ng-if="sarfaslForm.CodKol.$error.minValue">
- کد کل نمی تواند صفر باشد
- </p>
- </div>
- </td>
- <td data-ng-if="View.FinYear.LenM != 0">
- <div class="form-group" hs-show-errors hs-show-success>
- <input name="CodMoin" type="text" hs-restrict-pattern="[^\d]*" maxlength="{{View.FinYear.LenM}}"
- class="form-control input-sm"
- data-ng-model="View.Moin" data-ng-disabled="View.Level!==2"
- data-ng-blur="Events.codeChanged('m')"
- data-ng-change="Events.setSarfaslCod()"
- hs-disable-validation="View.Level!==2"
- data-ng-required
- hs-min-value="1" />
- <p class="help-block" ng-if="sarfaslForm.CodMoin.$error.required">
- کد معین الظامی می باشد
- </p>
- <p class="help-block" ng-if="sarfaslForm.CodMoin.$error.minValue">
- کد معین نمی تواند صفر باشد
- </p>
- </div>
- </td>
- <td data-ng-if="View.FinYear.LenT1 != 0">
- <div class="form-group" hs-show-errors hs-show-success>
- <input name="CodTafzil1" type="text" hs-restrict-pattern="[^\d]*" maxlength="{{View.FinYear.LenT1}}"
- class="form-control input-sm"
- data-ng-model="View.Tafzil1" data-ng-disabled="View.Level!==3"
- data-ng-blur="Events.codeChanged('t1')"
- data-ng-change="Events.setSarfaslCod()"
- hs-disable-validation="View.Level!==3"
- data-ng-required
- hs-min-value="1" />
- <p class="help-block" ng-if="sarfaslForm.CodTafzil1.$error.required">
- کد تفظیل یک الظامی می باشد
- </p>
- <p class="help-block" ng-if="sarfaslForm.CodTafzil1.$error.minValue">
- کد تفظیل یک نمی تواند صفر باشد
- </p>
- </div>
- </td>
- <td data-ng-if="View.FinYear.LenT2 != 0">
- <div class="form-group" hs-show-errors hs-show-success>
- <input name="CodTafzil2" type="text" hs-restrict-pattern="[^\d]*" maxlength="{{View.FinYear.LenT2}}"
- class="form-control input-sm"
- data-ng-model="View.Tafzil2" data-ng-disabled="View.Level!==4"
- data-ng-blur="Events.codeChanged('t2')"
- data-ng-change="Events.setSarfaslCod()"
- hs-disable-validation="View.Level!==4"
- data-ng-required
- hs-min-value="1" />
- <p class="help-block" ng-if="sarfaslForm.CodTafzil2.$error.required">
- کد تفظیل دو الظامی می باشد
- </p>
- <p class="help-block" ng-if="sarfaslForm.CodTafzil2.$error.minValue">
- کد تفظیل دو نمی تواند صفر باشد
- </p>
- </div>
- </td>
- <td data-ng-if="View.FinYear.LenJ != 0">
- <div class="form-group" hs-show-errors hs-show-success>
- <input name="CodJoz" type="text" hs-restrict-pattern="[^\d]*" maxlength="{{View.FinYear.LenJ}}"
- class="form-control input-sm"
- data-ng-model="View.Joz" data-ng-disabled="View.Level!==5"
- data-ng-blur="Events.codeChanged('j')"
- data-ng-change="Events.setSarfaslCod()"
- hs-disable-validation="View.Level!==5"
- data-ng-required
- hs-min-value="1" />
- <p class="help-block" ng-if="sarfaslForm.CodJoz.$error.required">
- کد جزء الظامی می باشد
- </p>
- <p class="help-block" ng-if="sarfaslForm.CodJoz.$error.minValue">
- کد جزء نمی تواند صفر باشد
- </p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- </td>
- </tr>
- <tr>
- <td>
- عنوان سرفصل
- </td>
- <td ng-class="{'has-error':sarfaslForm.HsbNam.$invalid && sarfaslForm.HsbNam.$dirty}">
- <div class="form-group" hs-show-errors hs-show-success>
- <input name="HsbNam" type="text" data-ng-model="View.Sarfasl.HsbNam"
- class="form-control input-sm"
- data-ng-required="true" />
- <p class="help-block" ng-if="sarfaslForm.HsbNam.$error.required">
- نام سرفصل الظامی می باشد
- </p>
- </div>
- </td>
- </tr>
- <tr>
- <td>
- </td>
- <td>
- <div class="radio" hs-show-errors>
- <label class="control-label">
- <input type="radio" data-ng-model="View.Sarfasl.HsbKind" name="HsbKind" data-ng-value="'00'"
- data-ng-required="true" />
- زیر سطح دارد
- </label>
- </div>
- <div class="radio" hs-show-errors>
- <label class="control-label">
- <input type="radio" data-ng-model="View.Sarfasl.HsbKind" name="HsbKind" data-ng-value="'11'"
- data-ng-required="true" />
- سطح آخر است
- </label>
- <p class="help-block" ng-if="sarfaslForm.HsbKind.$error.required">
- انتخاب یکی از حالات الظامی می باشد
- </p>
- </div>
- </td>
- </tr>
- <tr>
- <td>
- </td>
- <td>
- <div class="radio" hs-show-errors>
- <label class="control-label">
- <input type="radio" data-ng-model="View.Sarfasl.Permanent" name="Permanent" data-ng-value="'1'"
- data-ng-required="true" />
- حساب دائم
- </label>
- </div>
- <div class="radio" hs-show-errors>
- <label class="control-label">
- <input type="radio" data-ng-model="View.Sarfasl.Permanent" name="Permanent" data-ng-value="'0'"
- data-ng-required="true" />
- حساب موقت
- </label>
- <p class="help-block" ng-if="sarfaslForm.Permanent.$error.required">
- انتخاب یکی از حالات الظامی می باشد
- </p>
- </div>
- </td>
- </tr>
- <tr>
- <td>
- </td>
- <td>
- <div class="radio" hs-show-errors>
- <label class="control-label">
- <input type="radio" data-ng-model="View.Sarfasl.AccessFlag" name="AccessFlag" data-ng-value="0"
- data-ng-required="true" />
- حساب برای همه در دسترس باشد
- </label>
- </div>
- <div class="radio" hs-show-errors>
- <label class="control-label">
- <input type="radio" data-ng-model="View.Sarfasl.AccessFlag" name="AccessFlag" data-ng-value="1"
- data-ng-required="true" />
- حساب فقط برای کاربران زیر در دسترس باید
- </label>
- <p class="help-block" ng-if="sarfaslForm.AccessFlag.$error.required">
- انتخاب یکی از حالات الظامی می باشد
- </p>
- </div>
- </td>
- </tr>
- <tr data-ng-if="View.Sarfasl.AccessFlag==1">
- <td>
- </td>
- <td>
- <table class="table table-bordered table-hover">
- <thead>
- <tr>
- <th>
-
- </th>
- <th>
- کاربران
- </th>
- </tr>
- </thead>
- <tbody>
- <tr data-ng-repeat="user in View.UserList">
- <td>
- <div class="checkBox">
- <label class="control-label">
- <input type="checkBox" data-ng-model="user.Checked" data-ng-click="Events.userChecking(user)" />
- </label>
- </div>
- </td>
- <td>
- {{user.UserID}}
- </td>
- </tr>
- </tbody>
- </table>
- </td>
- </tr>
- <tr>
- <td>
- </td>
- <td>
- <!-- Hsb Types -->
- <div class="checkBox">
- <label class="control-label">
- <input type="checkBox" data-ng-model="View.CheckBoxAllowRegisterLiability"
- data-ng-click="Events.hsbTypeChecking(View.HsbTypes.AllowRegisterLiability,View.CheckBoxAllowRegisterLiability)" />
- اجازه ثبت بدهکاری در اسناد داشته باشد
- </label>
- </div>
- <div class="checkBox">
- <label class="control-label">
- <input type="checkBox" data-ng-model="View.CheckBoxAllowRegisterCredits"
- data-ng-click="Events.hsbTypeChecking(View.HsbTypes.AllowRegisterCredits,View.CheckBoxAllowRegisterCredits)" />
- اجازه ثبت بستانکاری در اسناد داشته باشد
- </label>
- </div>
- <div class="checkBox">
- <label class="control-label">
- <input type="checkBox" data-ng-model="View.CheckBoxReminderShouldOnlyBeDebtor"
- data-ng-click="Events.hsbTypeChecking(View.HsbTypes.ReminderShouldOnlyBeDebtor,View.CheckBoxReminderShouldOnlyBeDebtor)" />
- مانده حساب فقط باید بدهکار باشد
- </label>
- </div>
- <div class="checkBox">
- <label class="control-label">
- <input type="checkBox" data-ng-model="View.CheckBoxReminderShouldOnlyBeCreditor"
- data-ng-click="Events.hsbTypeChecking(View.HsbTypes.ReminderShouldOnlyBeCreditor,View.CheckBoxReminderShouldOnlyBeCreditor)" />
- مانده حساب فقط باید بستانکار باشد
- </label>
- </div>
- </td>
- </tr>
- <tr>
- <td>
- یادداشت
- </td>
- <td>
- <textarea data-ng-model="View.Sarfasl.YadDasht" cols="200" rows="4" class="form-control input-sm">
- </textarea>
- </td>
- </tr>
- <tr>
- <td>
- </td>
- <td>
- <button type="button" class="btn btn-sm btn-primary" data-ng-click="Events.saveSarfasl()">
- ذخیره اطلاعات
- </button>
- <a href="/#/Sarfasl" class="btn btn-sm btn-primary">
- بازگشت
- </a>
- </td>
- </tr>
- </tbody>
- </table>
- </form>
- </div>
编辑2:
当我使用这个,所有的控件都可以很好的查看每一个它自己.
但是在提交之后(提交按钮是正常按钮,没有任何效果,但是调用我的函数)在我的函数中,我看到整体结果的错误:
$scope.sarfaslForm.$invalid ==>真正
解决方法
这里是你的代码所做的假设.当您正在查看以检查验证时,您将检查值=== false,否则您将其添加到表单中,这不是您要描述的逻辑.
你所说的是,无论值如果该字段被禁用并设置为0,我希望它从表单中删除,那么如果值为false,我希望它从形式除去,否则验证该表单.只需进行逻辑检查即可查看该字段是否已禁用,并将其从验证中删除.
- if (value === 0) {
- form.$removeControl(control);
- } else if (value === false) {
- form.$addControl(control);
- angular.forEach(control.$error,validationToken) {
- form.$setValidity(validationToken,control);
- });
- } else {
- form.$removeControl(control);
- }