gpt4 book ai didi

javascript - 使用 AngularJS 跳过嵌套表单验证

转载 作者:IT王子 更新时间:2023-10-29 03:18:15 26 4
gpt4 key购买 nike

如何使用 AngularJS 跳过对嵌套表单的验证?即使其子表单无效,我也必须使外部表单有效。

在下面的示例中,外部形式应该是有效的(fOuter.$valid 必须为真)。默认情况下,它不是。有选择吗?

代码(jsFiddle):

<div ng-app ng-controller="Ctrl">  
<ng-form name="fOuter">
<h3>Outer form (valid={{fOuter.$valid}})</h3>
<input type="text" name="txtOuter" ng-model="outer" placeholder="(required)" required />
<ng-form name="fInner">
<h3>Inner form (valid={{fInner.$valid}})</h3>
<input type="text" name="txtInner" ng-model="inner" placeholder="(required)" required />
</ng-form>
</ng-form>
</div>

最佳答案

这是受 bernath 启发的我的解决方案,它将表单本身与其父项完全隔离开来。

此解决方案负责:

  • 表单有效性($valid, $invalid)
  • 表单交互($pristine,$dirty)
  • 嵌套表单有效性和交互

在本 JSFiddle 中查看实际效果.

angular.module('isolateForm',[]).directive('isolateForm', [function () {
return {
restrict: 'A',
require: '?form',
link: function (scope, elm, attrs, ctrl) {
if (!ctrl) {
return;
}

// Do a copy of the controller
var ctrlCopy = {};
angular.copy(ctrl, ctrlCopy);

// Get the parent of the form
var parent = elm.parent().controller('form');
// Remove parent link to the controller
parent.$removeControl(ctrl);

// Replace form controller with a "isolated form"
var isolatedFormCtrl = {
$setValidity: function (validationToken, isValid, control) {
ctrlCopy.$setValidity(validationToken, isValid, control);
parent.$setValidity(validationToken, true, ctrl);
},
$setDirty: function () {
elm.removeClass('ng-pristine').addClass('ng-dirty');
ctrl.$dirty = true;
ctrl.$pristine = false;
},
};
angular.extend(ctrl, isolatedFormCtrl);
}
};
}]);

要使用它,只需调用指令“isolate-form”:

<form name="parent">
<input type="text" ng-model="outside"/>
<ng-form name="subform" isolate-form>
<input type="text" ng-model="inside"/>
</ng-form>
</form>

关于javascript - 使用 AngularJS 跳过嵌套表单验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19333544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com