2013-03-08 7 views
18

この文書では、http://docs.angularjs.org/guide/directiveと、ディレクティブがコントローラによって互いに通信する可能性があるとしています。ディレクティブはコントローラによってどのように通信されますか?

コントローラ - コントローラコンストラクタ機能。コントローラは事前リンクフェーズの前にインスタンス化され、名前で要求すると他のディレクティブと共有されます(require属性を参照)。 これにより、ディレクティブは互いに通信し、互いの動作を強化することができます。

私はコントローラとどのように通信したのですか?それのための例やデモはありますか?

+2

チェック[この質問](のhttp://のstackoverflowを。 com/questions/14915332/what-does-require-of-directive-definition-object-take)と[this example](http://jsfiddle.net/bmleite/GSZkJ/)を参照してください。 – bmleite

+1

良い質問に気をつけてください。 – Stewie

+1

[その例](http://jsfiddle.net/bmleite/GSZkJ/)は少し誤解を招く。一見すると、コントローラインスタンスの 'num'プロパティを共有しているように見えます。実際に起こっているのは、内側ディレクティブが、外側ディレクティブコントローラインスタンスから内側と外側の両方のスコープオブジェクトにインクリメント機能をコピーすることだけです。それはテンプレートから呼び出されたときにthis ==ス​​コープオブジェクトになります。これらの点を説明しようとするこの[調整された例](http://jsfiddle.net/fess/a68Ra/)を参照してください。 –

答えて

34

おそらく、ディレクティブコントローラでルート変更が発生したときに作成されるコントローラを混乱させることでしょう。このセクションでは、ディレクティブコントローラについてのみ説明しています。したがって、同じHTML要素に2つのディレクティブがある場合、それらのディレクティブはコントローラを要求することによって通信できます。

その良い例は、ng-modelと通信する必要のあるディレクティブを作成する場合です。

myApp.directive('myDirective', function() { 
    return { 
     require: 'ngModel', 
     link: function($scope, elem, attrs, ngModelCtrl) { 
      // Here you can listen to different DOM events, and 
      // call ngModelCtrl when the model value needs to update 
     } 
    } 
}); 

そしてHTML::

<input type="text" ng-model="myModel" my-directive> 

あなたのディレクティブは次のように、そのあなたのディレクティブ関数が返すオブジェクトでそれを実装することにより、コントローラを公開することができng-modelは、コントローラを公開しているので、あなたはこのようにそれを必要とすることができますこの:

myApp.directive('myDirective1', function() { 
    return { 
     link: function($scope, elem, attrs) { 

     }, 
     controller: function() { 
      this.sayHello = function() { 
       alert("hello!"); 
      } 
     } 
    } 
}); 

myApp.directive('myDirective2', function() { 
    return { 
     require: 'myDirective1', 
     link: function($scope, elem, attrs, myDirective1Ctrl) { 
      myDirective1Ctrl.sayHello(); 
     } 
    } 
}); 

そしてHTML:

<input type="text" my-directive2 my-directive1> 

また、このように、require: '^myParentDirective'を書き込むことによって、親指令からの指示のコントローラを必要とすることができます

myApp.directive('myDirective1', function() { 
    return { 
     link: function($scope, elem, attrs) { 

     }, 
     controller: function() { 
      this.sayHello = function() { 
       alert("hello!"); 
      } 
     } 
    } 
}); 

myApp.directive('myDirective2', function() { 
    return { 
     require: '^myDirective1', 
     link: function($scope, elem, attrs, myDirective1Ctrl) { 
      myDirective1Ctrl.sayHello(); 
     } 
    } 
}); 

とHTMLを:

<div my-directive1> 
    <div my-directive2></div> 
</div> 
+3

偉大な答えをありがとう! – Freewind

+18

これは現在の角度のドキュメントがどのように畳み込まれているかを示しています。彼らは気にしない。 – honzajde

+0

@AndersEkdahlこれは、同じ要素と子要素と親要素の2つのディレクティブで機能すると言いますが、兄弟要素では機能しますか?私はこれの例を見たことがありますが、私はそれが自分自身を動作させることはできませんでした。私はいつも「そのような」指令に「そのような、そしてそのような」コントローラがないという誤りを得る。 – Nocturno

関連する問題