2016-07-01 12 views
0

私はAngular 1.5を使用しています。HTMLに条件付き属性を条件付きで追加したいユースケースがあります。角度:HTMLに条件付き属性を追加する

例: 条件が真である場合、directive1とdirective2を属性として追加します。

<ng-form class="myForm" directive1 directive2> 

と条件が偽のとき、私はdirective3とdirective4が属性

<ng-form class="myForm" directive3 directive4> 

として追加することにしたい私が直接、条件付きロジックをやって試してみましたが、これは動作しませんでした:

<ng-form class="myForm" {{ condition ? directive1 directive2 :directive3 directive4 }}> 

誰でも簡単にこれを達成するための提案がありますか?

+0

は、具体的directive1、directive2、directive3とdirective4のためのユースケースですか?それとも一般的には? – gaheinrichs

+0

@gaheinrichs条件に基づいて少なくとも2つの指令を追加したいのは間違いありません。これらのディレクティブは基本的にフォーム – vas

答えて

0

なぜng-ifを使用しないのですか?

<ng-form ng-if="condition" class="myForm" directive1 directive2> 
<ng-form ng-if="!condition" class="myForm" directive3 directive4> 
+0

にバリデーションを追加することですが、私はそのことを考えましたが、問題はng-ifがng-formにあるためフォーム全体を隠すためです。これを回避するには、ng形式のコンテンツを2回コピーして、それを回避してください。 – vas

+0

hmm、ng-formのロジックを含む新しいディレクティブを作成してみませんか?そうすれば、それは2本の線になるだけです – derp

+0

は同意します!これはリファクタリングのための良いアイデアですが、この時点では、条件に基づいてフォームの検証のための異なるディレクティブを注入できるという私の問題の解決策を探しています – vas

1

新しい答え

<ng-form class="myForm" ng-attr-directive1="{{condition}}" ng-attr-directive3="{{!condition }}"> 

ng-attrはあなたのケースを解決します。条件をチェックし、attrをHTML要素に追加します。

ONE OLD

は、なぜあなたはディレクティブ自体にng-showを使用することはできません。 conditionをチェックし、それが真である場合にのみ表示されます。

+0

これはフォーム検証のために作成された再利用可能なディレクティブこれらの指令すべてを変更しても、この新しい条件を組み込むのは良い考えではありません。私はちょうど条件に基づいてフォームにこれらを注入できる方法が必要です。 – vas

1

これらのディレクティブを別のディレクティブにラップすることもできます。そのための答えはすでにあります:

Add directives from directive in AngularJS

私は他の回答から、このコードを追加してい:

angular.module('app') 
    .directive('commonThings', function ($compile) { 
    return { 
     restrict: 'A', 
     replace: false, 
     terminal: true, 
     scope: { 
     condition: '=' 
     }, 
     priority: 1000, 
     link: function link(scope,element, attrs) { 
     if(!scope.condition){ 
      element.attr('directive1', ''); 
      element.attr('directive2', ''); 
     }else{ 
      element.attr('directive3', ''); 
      element.attr('directive4', ''); 
     } 

     element.removeAttr("common-things"); //remove the attribute to avoid indefinite loop 
     element.removeAttr("data-common-things"); //also remove the same attribute with data- prefix in case users specify data-common-things in the html 

     $compile(element)(scope); 
     } 
    }; 
    }); 
+0

これは良い提案のようです!誰かがもっと明るいアイディアを持っているなら、私はおそらく待つだろう。 – vas

関連する問題