在不影响父表单的情况下验证嵌套表单
validate nested forms without affecting the parent form
angularjs 1.5 中的嵌套表单存在验证问题,并且存在 issue in github about it.
但该主题中有 2 人提供了解决方案,其中一人已经打开通往 angularjs 核心的道路,即 ngFormTopLevel 指令,另一个由名为 isolate-form 的用户提供。
但他们都不能处理这种情况并且不适合我......至少!
让我们假设这个结构:
<ng-form name="X1" novalidate>
<ng-form name="X2" novalidate isolate-form>
<input name="Input01" ng-model="input1" required />
<p ng-show="X2.Input01.$touched && X2.Input01.$invalid">input is not valid</p>
<input name="Input02" ng-model="input2" required />
<input type="button" id="ButtonX2" value="Submit Nested Form" ng-disabled="X2.$invalid" />
</ng-form>
<input name="Input03" ng-model="input3" required ng-minlength="5" />
<input type="button" id="ButtonX1" value="Submit Nested Form" ng-disabled="X1.$invalid" />
</ng-form>
tl;博士:
ButtonX1 依赖于嵌套表单验证,它不应该!
测试用例 1:
第 1 步:在 input3 中填写任意文本且超过 5 个字符。
预期:应启用 ButtonX1。
结果:ButtonX1 仍然禁用。
测试用例 2:
第 1 步:用任何文本填充 input1。
第 2 步:用任意文本填充 input2。
预期:应启用 ButtonX2。
结果:ButtonX2 已启用。
测试用例 3:
第 1 步:在 input3 中填写任意文本且超过 5 个字符。
第 2 步:用任何文本填充 input1。
第 2 步:用任意文本填充 input2。
预期:应启用 ButtonX1 和 ButtonX2。
结果:ButtonX1 和 ButtonX2 已启用。
还有一个问题是当Input01无效时,嵌套表单中的P标签不显示。
我尝试了 isolateForm 和 ngFormTopLevel,但它们都有这个问题。
我认为这是符合您要求的解决方案。
<ng-form name="X1" novalidate>
<ng-form name="X2" novalidate isolate-form>
<input name="Input01" ng-model="input1" required />
<p ng-show="X2.Input01.$invalid && X2.Input01.$touched">input is not valid</p>
<input name="Input02" ng-model="input2" required />
<input type="button" id="ButtonX2" value="Submit Nested Form" ng-disabled="X2.$invalid" />
</ng-form>
<input name="Input03" ng-model="input3" required ng-minlength="5" />
<input type="button" id="ButtonX1" value="Submit Nested Form" ng-disabled="X1.Input03.$invalid" />
</ng-form>
似乎唯一需要做的就是在父表单控制器上调用 $removeControl。这个非常简单的指令一直在为我工作。适用于您的 ng-form。
function isolateFormDirective () {
return {
restrict: 'A',
require: ['form', '^form'],
link: function(scope, element, attrs, forms) {
forms[1].$removeControl(forms[0]);
}
}
}
export default isolateFormDirective;
angularjs 1.5 中的嵌套表单存在验证问题,并且存在 issue in github about it.
但该主题中有 2 人提供了解决方案,其中一人已经打开通往 angularjs 核心的道路,即 ngFormTopLevel 指令,另一个由名为 isolate-form 的用户提供。
但他们都不能处理这种情况并且不适合我......至少!
让我们假设这个结构:
<ng-form name="X1" novalidate>
<ng-form name="X2" novalidate isolate-form>
<input name="Input01" ng-model="input1" required />
<p ng-show="X2.Input01.$touched && X2.Input01.$invalid">input is not valid</p>
<input name="Input02" ng-model="input2" required />
<input type="button" id="ButtonX2" value="Submit Nested Form" ng-disabled="X2.$invalid" />
</ng-form>
<input name="Input03" ng-model="input3" required ng-minlength="5" />
<input type="button" id="ButtonX1" value="Submit Nested Form" ng-disabled="X1.$invalid" />
</ng-form>
tl;博士: ButtonX1 依赖于嵌套表单验证,它不应该!
测试用例 1:
第 1 步:在 input3 中填写任意文本且超过 5 个字符。
预期:应启用 ButtonX1。
结果:ButtonX1 仍然禁用。
测试用例 2:
第 1 步:用任何文本填充 input1。
第 2 步:用任意文本填充 input2。
预期:应启用 ButtonX2。
结果:ButtonX2 已启用。
测试用例 3:
第 1 步:在 input3 中填写任意文本且超过 5 个字符。
第 2 步:用任何文本填充 input1。
第 2 步:用任意文本填充 input2。
预期:应启用 ButtonX1 和 ButtonX2。
结果:ButtonX1 和 ButtonX2 已启用。
还有一个问题是当Input01无效时,嵌套表单中的P标签不显示。 我尝试了 isolateForm 和 ngFormTopLevel,但它们都有这个问题。
我认为这是符合您要求的解决方案。
<ng-form name="X1" novalidate>
<ng-form name="X2" novalidate isolate-form>
<input name="Input01" ng-model="input1" required />
<p ng-show="X2.Input01.$invalid && X2.Input01.$touched">input is not valid</p>
<input name="Input02" ng-model="input2" required />
<input type="button" id="ButtonX2" value="Submit Nested Form" ng-disabled="X2.$invalid" />
</ng-form>
<input name="Input03" ng-model="input3" required ng-minlength="5" />
<input type="button" id="ButtonX1" value="Submit Nested Form" ng-disabled="X1.Input03.$invalid" />
</ng-form>
似乎唯一需要做的就是在父表单控制器上调用 $removeControl。这个非常简单的指令一直在为我工作。适用于您的 ng-form。
function isolateFormDirective () {
return {
restrict: 'A',
require: ['form', '^form'],
link: function(scope, element, attrs, forms) {
forms[1].$removeControl(forms[0]);
}
}
}
export default isolateFormDirective;