2016-07-18 12 views
2

My AngualrJS(1.x)アプリケーションにはテキストボックスの検証を行うカスタムディレクティブがあります。ディレクティブは要素として使用する必要があります。バリデーションが必要なテキストボックスは、ディレクティブ要素内に置かなければなりません。このディレクティブには、検証のロジックを持つコンパイル関数があります。ng-if内にディレクティブが存在する場合、AngularJSディレクティブのコンパイル関数が実行されない

ディレクティブは完全に正常に動作しています。ラジオボタンのクリックに応じてテキストボックスを表示/非表示にする必要があるシナリオがあります。これを達成するために、私はng-ifの中に指示文を保存しようとしましたが、指示文がng-ifの中に入ると、コンパイル機能は起動しません。私はリンク機能でロジックを維持しようとしましたが、リンク機能もトリガされていません。私はサイドng-showに指示を残すことができません。なぜなら、隠されたシナリオの間に、必要なフィールドの検証もまだ有効であり、ng-requiredの条件を使用したくないからです。

ng-ifの中で私のディレクティブを実行する方法はありますか?なぜそれが実行されていないのか分かりません。どんな助けも高く評価されます。

+0

「ng-if」によって作成された子スコープの場合があります。表示/非表示には 'ng-hide/ng-show'を使用します。 –

+0

代わりに完全な段落を書くことは、理解しやすいfiddlleまたはplunkerを作成する –

答えて

0

ng-ifng-show両方がDOM要素を表示/非表示するために使用されているが、それらの間の主な違いは、ng-if="expression"要素を取り除くことである(もちろん、それはすべての子だ)expressionがfalseと評価された場合にDOMから。

ng-show="expression"は、.ng-hideクラス(display: noneを追加)に基づいて要素を非表示にします。

ng-ifを使用していて、式がfalseと評価された場合、ng-ifの優先度が高いため、他のディレクティブは実行されずコンパイルされません。あなたのカスタムディレクティブが実行されていないのはこのためです。

ng-ifの代わりにng-showを使用してください。

編集:私はちょうど

あなたの質問を再読み込み、あなたができることを知るようになったではないあなたのために必要なフィールド検証のng-show。私はそれについても解決策を得ました。これは、そのフィールドのみが必要なあなたのチェックボックスがチェックされているマークする場合

ng-required="sameExpressionAsInNgShow" 

利用代わりrequiredng-requiredとは、このようなあなたが(ng-ifで、現在は)ng-showで使用する同じ表現を使用しています。

+0

おっと!あなたは 'ng-required'も使いたくありません。 –

+0

返信Shashankに感謝します。 ng-requiredで式を使用したくない理由は、min-lengthのような他のバリデーションがあるからです。ユーザーがフィールドを表示するオプションボタンを選択し、最小の長さを入力していないし、コントロールを非表示にするフォームも有効ではありません。したがって、私は各検証の表示/非表示を処理したくありません。なぜ命令がng-if == trueのシナリオで実行されないのか分かりません。私は、指示文の優先順位を2000に設定してみたかったのですが、運もいいとは思いませんでした。:( –

+0

ああ、「ng-if」がtrueに評価されても、その指示文はコンパイルされません。 plunkr/fiddleまたはStackOverflowスニペット。 –

関連する問題