2013-06-05 17 views
8

我有這樣的代碼:如何使用兩個指令的控制器?

JS:

angular.module("module") 
    .controller("fooController", ["$scope", function($scope) { 
    ... 
    }) 
    .directive("foo", function() { 
    return { 
     restrict: "E", 
     controller: "fooController", 
     link: function($scope, $element, $attrs) { 
     // Do some things with the scope of the controller here 
     } 
    } 
    }) 
    .directive("bar", function() { 
    return { 
     restrict: "E", 
     require: "fooController", 
     link: function($scope, $element, $attrs) { 
     // Nothing yet 
     } 
    } 
    }); 

HTML:

<html> 
    <head> 
    <!-- Scripts here --> 
    </head> 
    <body ng-app="module"> 
    <foo/> 
    <bar/> 
    </body> 
</html> 

指令foo作品,但指令bar拋出一個錯誤:No controller: fooController

我怎樣才能解決這個問題,同時保持我目前的結構(控制器不是HTML內,但使用的指令,bar是外foo並共享相同的控制器,而兩者都修改它的範圍)?我閱讀here的討論,但我無法理解如何去做。

+0

出於好奇,爲什麼你對這兩個指令使用相同的控制器? – callmekatootie

+0

我需要在它們之間共享一些數據。你知道更好的方法來做到這一點嗎? – tgkokk

+0

是 - 服務! '$ rootScope'也是這樣做的,但會被人詬病。 http://stackoverflow.com/questions/9293423/can-one-controller-call-another-in-angularjs - 這就是你需要知道的在控制器之間進行通信的全部內容。 – callmekatootie

回答

5

因爲你的最終目標是控制器之間的通信,就不必再使用多個指令相同的控制器(我懷疑重新使用會讓你溝通)。無論如何,最好的辦法是使用服務。

文章Can one controller call another?談得很詳細,但簡單來說,首先創建一個服務:

app.factory('myService', function() { 
    var data; 
    return { 
     getData: function() { 
      return data 
     }, 
     setData: function (newData) { 
      data = newData; 
     } 
    }; 
}); 

然後你可以在你的控制器使用此服務,並通過使用setData()getData()功能,每個控制器進行通信服務。

4

您不需要控制器。您可以要求指令,該指令是當前指令的父母之一。

<foo> 
     <bar /> 
    </foo> 

    // in foo 
    controller: 'fooController' 
    // in bar 
    require: '^foo' //^means to search it up in the tree 

這裏的酒吧可能需要foo和這將有Foo的控制器:http://jsfiddle.net/Zmetser/kHdVX/ 在這個例子中fooController'll初始化一次。

<foo /> 
    <bar /> 

    // in foo 
    controller: 'fooController' 
    // in bar 
    controller: 'fooController' 

這裏的酒吧和Foo有它的FooController的實例:http://jsfiddle.net/Zmetser/QypXn/

+0

但是,如果你的指令是兄弟姐妹,服務是一個解決方案。 – Oliver

+0

好的解決方案,當指令不必是兄弟姐妹時,我一定會使用它。對於這種情況下,callmekatootie's是更好的恕我直言。 – tgkokk

相關問題