2013-03-08 60 views
18

在本文檔中:http://docs.angularjs.org/guide/directive表示指令可以通過控制器相互通信。指令如何通過控制器進行通信?

控制器 - 控制器構造函數。控制器在預鏈接階段之前被實例化,並且如果它們按名稱請求它,則與其他指令共享(請參閱require屬性)。 這允許指令相互溝通並增強彼此的行爲。

我不明白,他們如何與控制器溝通?有沒有任何示例或演示?

+2

檢查[這個問題](HTTP://計算器。 com/questions/14915332/what-does-require-of-directive-definition-object-take)和[this example](http://jsfiddle.net/bmleite/GSZkJ/)。 – bmleite 2013-03-08 09:11:30

+1

跟上好問題。 – Stewie 2013-03-08 10:39:07

+1

[該示例](http://jsfiddle.net/bmleite/GSZkJ/)有點誤導。乍一看它似乎在共享控制器實例的'num'屬性。當實際發生的唯一事情是內部指令時,將增量函數從外部指令控制器實例複製到內部和外部共享的範圍對象。當它從模板調用這個==範圍對象。看到這個[調整的例子](http://jsfiddle.net/fess/a68Ra/),試圖說明這些觀點。 – 2013-07-16 19:18:28

回答

34

也許你在使用指令控制器發生路由更改時創建的控制器混淆。該部分只是討論指令控制器,因此該部分的含義是,如果您在同一個HTML元素上有兩個指令,則它們可以通過要求其他每個控制器進行通信。

一個很好的例子就是如果你創建了一個需要與ng-model溝通的指令。由於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> 

你的指令可以在對象實現它,你的指令函數返回暴露出控制器,像這樣的:

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 2013-03-08 11:56:59

+18

這隻能證明如何...錯綜複雜的是當前的角度文檔。他們根本不在乎。 – honzajde 2013-04-05 16:18:59

+0

@AndersEkdahl你提到這適用於同一元素的兩個指令,也適用於子元素和父元素,但是它是否適用於兄弟元素?我見過這樣的例子,但我從來沒有能夠自己工作。我總是得到'這樣那樣的'指令的錯誤沒有'這樣和那樣''控制器。 – Nocturno 2013-08-26 18:18:12

相關問題