2013-05-17 26 views
4

IM相當新的angularJS和我有一個問題(希望這不是啞):兩個指令(不是嵌套在HTML中)如何相互通信?

我得到了2個指令(未嵌套):

<div directive1></div> 
<div directive2></div> 

現在我想的指令來相互交談與控制器(IVE定義「控制器:」在指令1):

myApp 
    .directive('directive2', function() { 
     return { 
      require: "^directive1", 

      link: function (scope, element, attrs, directive1Ctrl) { 
       directive1Ctrl.doSomething(); 
      } 
     }; 
    }); 

BUT我總是得到「控制器未找到」異常..(IM不是不確定的^引起,其只對阻鐵通過父母向上看)。
如果它們沒有嵌套,是否可以使用directive2中定義的Controller中定義的Controller? 我是否必須使用「分開」的控制器,這兩個控制器都需要相互協作?

+1

什麼阻止你有多個相同的指令?即2個指令1和1個指令2誰與誰談話? –

+0

它的一個小功能,我想實現...那裏我需要2個不同的組件互相交談,這是不是嵌套 – Jenson

+0

是否有一些原因,你不能只是綁定相同的變量,並觀看它? – lucuma

回答

6

我是否必須使用「分開」控制器,它們都需要相互協作?

This is close。在應用程序的不同部分(兩個控制器,兩個指令,一個指令和一個控制器等)之間共享數據和功能的標準方法是在服務中提供該數據或功能。然後可以將此服務注入到需要它的任何應用程序組件中。

對於您的情況,您可以創建一個服務,該服務提供doSomething函數並將其注入directive1directive2

+1

多數民衆贊成我的預期:(...想想讓指令通過範圍談話..但我認爲該服務可能會更加健壯..謝謝反正;) – Jenson

3

如果設置require: "^directive1",您的指令2必須在指令1:

<div directive1> 
    <div directive2></div> 
</div> 

您還可以使用「指令1?」這使得它可選。

簡單說:有兩種類型的控制器:指令控制器和普通控制器。

使用控制器,您可以在視圖中更新範圍中設置值。 這是一個控制器和兩個指令一個plunkr:http://plnkr.co/edit/IicvQfuv8LMOb4iVQen5

var app = angular.module('plunker', []); 

app.directive('directive1', function() { 
    return { 
     restrict: 'A', 
     replace: true, 
     template: '<span>{{bar}}</span>' 
    } 
}); 

app.directive('directive2', function() { 
    return { 
     restrict: 'A', 
     replace: true, 
     template: '<b>{{bar}}</b>' 
    } 

}); 

app.controller('MainCtrl', function($scope) { 
    $scope.name = 'World'; 
    $scope.foo ="layla"; 
    $scope.bar ="hello"; 
}); 

和HTML:

<body ng-controller="MainCtrl"> 
    this is directive1: <div directive1>{{foo}}</div>. 
    <br /> 
    this is directive2: <div directive2>{{foo}}</div>. 
    Hello {{name}}! 
</body> 

注意,指令是您的瀏覽器可以解析新的元素。它們是您在app.directive()部分中定義行爲的HTML的擴展。

當AngularJS發現{{foo}}時,它會將其綁定到可以使用可訪問該範圍的閉環控制器修改的作用域。在這種情況下,MainCtrl。你也可以把MainCtrl放在<div ng-controller="MainCtrl">...</div>

在你的代碼中,你沒有找到控制器,因爲它在樹上找到一個名爲directive1Ctrl的控制器,這從來沒有發生過。