AngularJS - 表单自定义验证 - 检查至少一个输入是不是为空

Posted

技术标签:

【中文标题】AngularJS - 表单自定义验证 - 检查至少一个输入是不是为空【英文标题】:AngularJS - Form Custom Validation - Check if at least one input is emptyAngularJS - 表单自定义验证 - 检查至少一个输入是否为空 【发布时间】:2013-08-18 03:12:03 【问题描述】:

给定一个像这样的简单 html 表单:

<form name="myForm" action="#sent" method="post" ng-app>
   <input name="userPreference1" type="text" ng-model="shipment.userPreference" />
   <input name="userPreference1" type="text" ng-model="shipment.userPreference" />
   <input name="userPreference1" type="text" ng-model="shipment.userPreference" />
... submit input and all the other code...
</form>

如果至少有一个输入为空,我需要您的帮助来了解如何检查验证时间。所需的验证如下。用户必须至少完成一项首选项。

使用 jQuery 这个:

if ( $("input").val() == "" ) 

工作正常,但想弄清楚如何使用 angular 来做同样的事情。

非常感谢,

吉列尔莫

【问题讨论】:

【参考方案1】:

我的解决方案如下:

        $scope.requiredInputsGroup = function () 
            var isRequired = true;
            if (!$scope.shipment) 
                return true;
            
            angular.forEach(["userPreference1", "userPreference2", "userPreference3"], function (input) 
                if ($scope.shipment[input]) 
                    isRequired = false;
                    return false;
                
            );

            return isRequired;
        ;

您将该方法应用于每个输入中的data-ng-required...

<form name="myForm" action="#sent" method="post" ng-app>
   <input name="userPreference1" type="text" ng-model="shipment.userPreference1" ng-required="requiredInputsGroup()" />
   <input name="userPreference2" type="text" ng-model="shipment.userPreference2" ng-required="requiredInputsGroup()" />
   <input name="userPreference3" type="text" ng-model="shipment.userPreference3" ng-required="requiredInputsGroup()" />

   <button type="submit" ng-disabled="myForm.$invalid">Submit</button>
</form>

我应用的最后一点是使用简单的myForm.$invalid 禁用按钮

【讨论】:

很好的解决方案!我对其进行了更改,以便您可以传递您正在测试的模型,而不是将数组传递给 forEach。唯一的问题是针对未选中时返回“N”的复选框进行测试,但这很容易在 if 中检查。谢谢!【参考方案2】:

所以我们的想法是在所有输入都为空的情况下禁用提交按钮。你可以这样做

<form name="myForm" action="#sent" method="post" ng-app>
   <input name="userPreference1" type="text" ng-model="shipment.userPreference1" />
   <input name="userPreference1" type="text" ng-model="shipment.userPreference2" />
   <input name="userPreference1" type="text" ng-model="shipment.userPreference3" />

   <button type="submit" ng-disabled="!(!!shipment.userPreference1 || !!shipment.userPreference2  || !!shipment.userPreference3)">Submit</button>
</form>

!!str 是强制将str 转换为boolean 值。 !!null!!"" 都被评估为 false

Demo

【讨论】:

sza,感谢您的回答!用户不需要输入所有字段,只需输入一个,因此我需要在验证时检查是否填充了至少一个输入。 @Guillermo 那么他们应该有不同的模型。 @Guillermo Checkout ng-repeat。请记住,AngularJS 是数据/模型驱动的,如果您想在正常情况下操作 dom,只需考虑如何设计数据结构。并且 angularjs 会神奇地为你改变 dom。 有更好的方法来做到这一点。在您的每个输入中,添加 ng-required。这将导致您的表单控制器运行验证,然后您的 您不需要 !! 字符串 - 只需使用 !(shipment.userPreference1 || shipment.userPreference2 || shipment.userPreference3)【参考方案3】:

您可以在输入元素和样式/代码中设置“必需”,并使用表单的 $valid 来处理您想要的方式。查看http://dailyjs.com/2013/06/06/angularjs-7/

【讨论】:

Mouli,谢谢你的回答,我知道这很奇怪,但在原始状态下,用户会看到三个输入,并且需要填写至少一个,但不是全部。所以这就是为什么我认为添加 required 不适合我。我需要一些等效的 $("input").val() == "" 应用于 angularjs。谢谢!!

以上是关于AngularJS - 表单自定义验证 - 检查至少一个输入是不是为空的主要内容,如果未能解决你的问题,请参考以下文章

angularjs 表单验证ngMessages和创建自定义指令结合

测试自定义验证 angularjs 指令

AngularJS中使用的表单验证

通过使用 AngularJS 的自定义登录进行 Spring Security 身份验证

[AngularJS] AngularJS系列 中级篇之表单验证

[AngularJS] AngularJS系列 中级篇之表单验证