AngularJSでフォーム入力を条件付きでどのように要求できますか?


234

AngularJSを使用してアドレス帳アプリケーション(不自然な例)を構築しているとします。

メールと電話番号の入力がある連絡先のフォームがあり、どちらか一方を必須にしたいが両方email必要ではない場合:phone入力が空または無効である場合にのみ入力が必須であり、その逆も同様です。

Angularにはrequiredディレクティブがありますが、この場合のドキュメントの使い方はドキュメントから明確ではありません。では、条件付きでフォームフィールドをどのように要求できるでしょうか。カスタムディレクティブを記述しますか?

回答:


463

カスタムディレクティブを記述する必要はありません。Angularのドキュメントは良いですが完全ではありません。実際、と呼ばれるディレクティブ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/


5
それは問題ではないでしょう?それに応じて条件を更新するだけです。あなたがもう少し必要なものを説明すれば、私(またはここにいる他の人)があなたを示すことができます:)
Puce

1
補足として、関数を使用して、そこでより複雑なロジックを実行することもできます。
Leandro Zubrezki

1
この機能は、ドキュメント化されています:docs.angularjs.org/api/ng/directive/ngRequired
bjunix

25

他が書かれている場合に必要な入力を入れたい場合:

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

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

よろしく。


14

次のような角度検証を使用できます:

 <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' /> 

これで、1つのテキストフィールドのみに値を入力できます。名前または姓を入力できます。このようにして、AngularJで条件付きの必須の塗りつぶしを使用できます。


両方のフィールドに入力することはできますか?
myTerminal

はい、ユーザーは両方のフィールドに入力できます。この状態でも、ユーザーが1つのフィールドに入力すると、他のフィールドは必須ではありません
Bipin Shilpakar

13

Angular2の場合

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

編集:これはコンソールエラー「ExpressionChangedAfterItHasBeenCheckedError:式がチェックされた後に変更されました」をスローしています。ラジオボタンをチェックすると、これを適用していますが、条件付き検証を実行しているように見えます。
エリックソイク2018

4
Angular2 +はこの質問にタグ付けされていません。これは本質的に異なるフレームワークであるため、この回答は関係ありません。
isherwood 2018年

1
@isherwoodあなたは正しい。ここでググる途中に終わったので追加しました。反対投票や物議を醸した場合は削除します。
laffuste

@Iaffusteでは、Angular2 +の新しい質問に投稿して返信し、これを調べている人が簡単にできるようにします。+1とにかく=)
arjel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.