4

分離されたスコープといくつかのエイリアスプロパティを使用していくつかのディレクティブを作成しています。例えば:

scope: {
   prop1: '@'
}

私の質問は、これらのエイリアスがいつスコープに追加されるのかということです。リンク関数でプロパティが定義されていないという問題が発生していました。このjsFiddleを実行した後、コンソールを確認してください:http: //jsfiddle.net/rvd6x/

通常どおりプロパティを取得しようとすると、定義されていません。後で関数(doStuff())を介して取得しようとすると、そこにあります。または、$timeout0でaを実行すると、そこにあります。明らかに、を使用して問題を回避することは$timeoutできますが、スコープがリンク関数ですぐにそれを持っていると期待できない理由を知りたいです。$timeout私のすべての指示に注入しなければならないのは、一種の苦痛でしょう。

4

2 に答える 2

4

これはディレクティブ定義内で機能することがわかりました。

scope: {
    prop1: '@'
},
link: function(scope, element, attrs) {
    ...
    attrs.$observe('prop1', function(val) { 
        scope.prop1 = val || 'default'
    });
    ...
}

作る

<div my-directive></div>

次のように動作します

<div my-directive prop1="default"></div>
于 2013-02-02T21:53:03.533 に答える
1

私の理解は次のとおりです。一般に、ディレクティブでは、スコープ内の変数が定義されている、または安定した値を持っていると想定することはできません。興味のあることは何でも$watchする必要があります。

ng-repeatについて考えてみてください。繰り返しているものは、リンク時に存在しない可能性があり、頻繁に変更される可能性があります。これらのシナリオを処理するのはディレクティブ次第です。

これでは質問に答えられないことがわかりました。スコープ値を明示的に設定する分離スコープを作成しているため、直感的にはng-repeatの例とは異なります。しかし、Angularはそれらを同じように扱っているように見えます。これはおそらく良いことです。

属性を使用する必要があるものに応じて、2つの方法で問題を解決できると思います。

  1. 評価された値であり、変更される可能性がある場合は、反応できるように時計で包んでください。
  2. 静的な値の場合は、attrs.prop1を使用して、リンクfnの先頭でプルダウンできます。

私がここでフィドルに追加したこれらのオプションの両方。

于 2012-09-29T20:31:40.437 に答える