如何有条件地要求使用 AngularJS 进行表单输入?

Posted

技术标签:

【中文标题】如何有条件地要求使用 AngularJS 进行表单输入?【英文标题】:How can I conditionally require form inputs with AngularJS? 【发布时间】:2012-11-08 02:28:06 【问题描述】:

假设我们正在使用 AngularJS 构建一个地址簿应用程序(人为的示例)。

我们有一个联系人表单,其中包含电子邮件和电话号码的输入,我们希望要求一个或另一个,但不是两者:我们只需要如果phone 输入为空或无效,则需要email 输入,反之亦然。

Angular 有一个 required 指令,但从文档中不清楚在这种情况下如何使用它。那么我们如何有条件地需要一个表单域呢?编写自定义指令?

【问题讨论】:

【参考方案1】:

无需编写自定义指令。 Angular 的文档很好,但并不完整。 In fact,有一个名为 ngRequired 的指令,它采用 Angular 表达式。

<input type='email'
       name='email'
       ng-model='contact.email' 
       placeholder='your@email.com'
       ng-required='!contact.phone' />

<input type='text'
       ng-model='contact.phone'             
       placeholder='(xxx) xxx-xxxx'
       ng-required='!contact.email' />  

这里有一个更完整的例子:http://jsfiddle.net/uptnx/1/

【讨论】:

应该没问题吧?只需相应地更新条件。如果您再解释一下您需要什么,我(或这里的其他人)将能够向您展示:) 附带说明,您还可以使用函数并在那里执行更复杂的逻辑。 此功能现已记录在案:docs.angularjs.org/api/ng/directive/ngRequired【参考方案2】:

如果你想输入需要的输入,如果有其他的:

   <input type='text'
   name='name'
   ng-model='person.name'/>

   <input type='text'
   ng-model='person.lastname'             
   ng-required='person.name' />  

问候。

【讨论】:

【参考方案3】:

对于 Angular2

<input type='email' 
    [(ngModel)]='contact.email'
    [required]='!contact.phone' >

【讨论】:

编辑:这会引发控制台错误“ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改。”当我检查单选按钮时,我正在应用它,但它似乎确实进行了条件验证。 Angular2+ 在这个问题上没有被标记。因为它本质上是一个不同的框架,所以这个答案是不相关的。 @isherwood 你是对的。我添加它是因为我在谷歌搜索时在这里结束了。如果它被否决或引起争议,我会删除它。 @Iaffuste 您可以发布并回复 Angular2+ 的新问题,以方便人们调查此问题。无论如何 +1 =)【参考方案4】:

您可以使用角度验证,例如:

 <input type='text'
   name='name'
   ng-model='person.name'
   ng-required='!person.lastname'/>

   <input type='text'
   name='lastname'
   ng-model='person.lastname'             
   ng-required='!person.name' /> 

您现在只能在一个文本字段中填写值。您可以填写姓名或姓氏。这样就可以在AngularJs中使用条件必填。

【讨论】:

仍然可以同时填写这两个字段,不是吗? 是的,用户可以同时填写两个字段,在这种情况下,如果用户填写一个字段,另一个字段不是必需的【参考方案5】:

在 AngularJS(版本 1.x)中,有一个内置指令 ngRequired

<input type='email'
       name='email'
       ng-model='user.email' 
       placeholder='your@email.com'
       ng-required='!user.phone' />

<input type='text'
       ng-model='user.phone'             
       placeholder='(xxx) xxx-xxxx'
       ng-required='!user.email' /> 

Angular2 或以上版本

<input type='email'
       name='email'
       [(ngModel)]='user.email' 
       placeholder='your@email.com'
       [required]='!user.phone' />

<input type='text'
       [(ngModel)]='user.phone'             
       placeholder='(xxx) xxx-xxxx'
       [required]='!user.email' /> 

【讨论】:

【参考方案6】:

对于 Angular 2

<input [(ngModel)]='email' [required]='!phone' />
<input [(ngModel)]='phone' [required]='!email' /> 

【讨论】:

以上是关于如何有条件地要求使用 AngularJS 进行表单输入?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自 AngularJS 控制器的无效输入正确清理表单?

如何在AngularJS网格中有条件地将列更改为文本框?

使用 VBA 代码有条件地使表单行的(详细信息)按钮变灰

在 angularjs 中有条件地引导应用程序

在 AngularJS 中有条件地应用属性的最佳方法是啥?

AngularJS中表单设置有效性的延迟