2

私は angularJS を使い始めたばかりで、ディレクティブとコントローラーのスコープについて頭を悩ませています。

以下にリンクした例では、2 つのディレクティブのセットがあります。1 つの属性ディレクティブ ( showMessage) と 1 つの要素ディレクティブ ( parentDirective)。

http://jsfiddle.net/ejSxM/1/

showMessage要素がクリックされると、コントローラーで関数が起動されるように、動作として使用したいと思います。これは通常の html 要素では正常に機能しますが、これを my に適用するとparentDirective、コントローラではなく のshowMessageスコープが適用されます。parentDirective

これは、添付の例で実証できます。「私は一人です」をクリックすると、ディレクティブはコントローラのスコープを持っているので、showMessageコントローラのスコープ内の関数は正常に呼び出されます。ただし、「私はディレクティブです」をクリックすると、ディレクティブは親ディレクティブのスコープを持ち、エラーにフラグを立てます。

親ディレクティブに分離スコープがある場合でも、ネストされたディレクティブからコントローラー スコープにアクセスできる方法はありますか?

4

2 に答える 2

4

次のように式をディレクティブに渡すことができます。 <my-directive onsomeevent="functionInMyController()"></my-directive>

そして、あなたのディレクティブで:

...
scope: {
    onevent: '&onsomeevent'
},
link: function() {
    element.bind('click',function () {
       scope.onevent(); 
    });
}
...

つまり、onsomeevent引数から式をバインドして、式が何であるかを知らなくてもディレクティブ内で実行できるようにします。式は親スコープで実行されるため、親スコープでfunctionInMyController定義する必要があります。リンク関数からその式に変数を渡すこともできます。これは、ここ (スコープ セクション) のディレクティブの例を見つけることができます。

于 2013-02-21T14:22:51.637 に答える
1

ディレクティブにコントローラーを設定できます。

controller - Controller constructor function. The controller is instantiated 
before the pre-linking phase and it is shared with other directives if they 
request it by name (see require attribute).
This allows the directives to communicate with each other and augment each other's 
behavior. The controller is injectable with the following locals:
$scope - Current scope associated with the element
$element - Current element
$attrs - Current attributes obeject for the element
$transclude - A transclude linking function pre-bound to the correct transclusion
scope:     
function(cloneLinkingFn).

http://docs.angularjs.org/guide/directive

于 2013-02-21T14:51:10.883 に答える