2017-05-31 4 views
0

を示しています角度指令コードは、スコープを変更しますが、テンプレートは、私は次のようなディレクティブを持って同じ値

.directive('myDirective', function() { 
    return { 
     restrict: 'AE', 
     replace: true, 
     templateUrl: '/myDirective.html?v=' + window.buildNumber, 
     link: function (scope, element, attrs) { 
      scope.itemClasses = attrs.itemClasses || ''; 
     } 
    } 
}) 

をし、それはテンプレートのは、次のようになります。

<div class="my-directive"> 
    <div class="items" ng-repeat="item in items"> 
     <div class="item {{ itemClasses }}">{{ item.title }}</div> 
    </div> 
</div> 

とそのディレクティブが異なる中で呼び出されました

<my-directive item-classes="col-md-6"></my-directive> 
... 
<my-directive item-classes="col-md-12"></my-directive> 

すべてのテンプレートは同じ値の012をレンダリングします(テンプレートごとに1つの呼び出し)。。同時にリンク機能が適切な値を設定します(私はconsole.log()の呼び出しでこの事実を確認しました)。

scope: true属性をディレクティブのコードに追加すると、すべて正常に動作します。だから、それは自分の継承されたスコープを持つように思えます。あなたは私にこのような行動を説明できますか?

ありがとうございます。

答えて

1

scope: trueを使用すると、ディレクティブの子スコープを作成すると同時に、親からプロパティも継承します(この場合、私はあなたのコントローラと思います)。つまり、あなたの指示句のすべてのインスタンスが適切なスコープを持つことになります。

scope: falseを使用すると、実際にはディレクティブにスコープはなく、スコープはその親と共有されます。

だから、あなたがこれを行うとき、scope:falseを持つ、バックあなたの質問に来て:あなたは親のスコープにitemClassesプロパティを設定している

scope.itemClasses = attrs.itemClasses || '';

。 これは、リンク機能では正常に動作しているように見えますが、現実にはコントローラの同じスコープ変数をオーバーライドするたびに発生します。

scope.itemClasses= 'col-md-6';

が、二回目は、実際には新しい値で、親の同じスコープの変数をオーバーライドします。

だから、あなたのケースでは、最初の時間は、あなたは親コントローラにスコープ変数を関連付けます:

scope.itemClasses= 'col-md-12';

それは理にかなっていますか?

+0

ありがとうございます!私はそれが正しいことを確かめるために要約してください。 'link'関数はすべてのテンプレートレンダリングの前に呼び出されます。だから、私のコードはスコープ内の同じ属性をオーバーライドするだけです。テンプレートをレンダリングするときには、最後に割り当てられた値があります。右? – dizpers

+0

スコープ:真のアプローチは正しいですか?それとももっと良いことがありますか? – dizpers

+0

短く:スコープがfalseの場合、親のスコープを使用します。したがって、常に親のスコープ内に同じ変数を設定しています。したがって、常に同じ変数を上書きします。適切なアプローチのためには、この値で何をしようとしているかによって異なります。 itemClassesで何をするつもりですか?コントローラの変数が変わったときに変更する必要がありますか? – quirimmo

1

属性から直接item-classesをバインドすると、基本的に属性値のコピーが作成されます。

このためのソリューションがある:あなたがinput-classesあなたがそうのように分離されたスコープを使用して結合入力をしたい場合:

{ 
    restrict: 'AE', 
    replace: true, 
    scope: { 
     itemClasses: '=' 
    }, 
    templateUrl: '/myDirective.html?v=' + window.buildNumber, 
    link: function (scope, element, attrs) { 
     // scope.itemClasses = attrs.itemClasses || ''; 
    } 
} 

それとも、あなたはあなたができる、分離されたスコープを使用したくない場合ユーザーattrs.$observe

link: function (scope, element, attrs) { 
    attrs.$observe('itemClasses ', function(val) { 
     scope.itemClasses = val || ''; 
    }); 
} 
+0

ありがとうございます。 AFAIU、分離されたスコープは、私が外側スコープの属性にアクセスすることを許可しません。だから、それは私の選択肢ではありません。 @ Likimmoの答えを考慮して、私は第2の解決策についてはわかりません。つまり、テンプレートをレンダリングする前に実行されるようです。つまり、テンプレートレンダリングステップでは、最後に割り当てられた値が割り当てられます。 – dizpers

関連する問題