2015-09-01 16 views
0

在過去的幾天中,我已經閱讀了很多關於指令和控制器之間的連接。我已經做了一些觀察,但是很難將它們放在一起,並可以使用一些指導。把控制器和指令交織在一起的方式

大約有四種或五種方式我看到控制器和指令混合在一起。

鑑於:

angular.module('myApp', []); 
myApp.controller('ctrlName', function($scope){ 
    $scope.someVar = "some value"; 
}); 

我看到的指令和控制器進行交互和被附接至彼此以下列方式:

1)以一個點

myApp.controller('ctrlName', function($scope){ 
    $scope.someVar = "some value within controller"; 
}) 
.directive('drtvName', function(){ 
    return { 
    scope: { 
     someVar: 'some value within directive' 
    } 
    } 
}); 

2鏈接在一起)控制器指定爲指令的方法。這如何與控制器以上,如果它是點鏈接(如#1)

myApp.directive('drtvName', function(){ 
    scope: {/*not sure what it means when this is simply an empty object*/}, 
    controller: function(scope){ 
    /*is this completely separate from myApp.controller('name', function(){});*/ 
    } 
}); 

3)控制器被指定爲應用程序中的單獨的控制器名稱的一部分進行交互。我真的不知道這兩個scope將如何混合

myApp.directive('drtvName', function(){ 
    controller: 'ctrlName', 
    scope: { 
    connectedToCtrlScopeOrJustHTMLView: 'dunno' 
    } 
}); 

4)這裏是一個新的。控制器作爲父控制器是必需的。當我用這個修修補補,我甚至不能得到它使用鏈接的方法來工作,所以我不知道什麼時候會是有用的

myApp.directive(drtvName', function(){ 
    scope: {}, 
    require: '^myParentController' //not sure what scope will be one line about with this option 
}); 

回答

2

你列出在許多方面有變化的相互作用,但我會盡量總結他們在這裏:

  1. 這說明創建一個模塊,並添加一個指令和控制器到該模塊。在這種情況下,它們並不互相影響,而是與模塊本身互動。 .directive.controller的返回值是模塊,所以這是鏈接來自的地方。

  2. 在這種情況下,您正在定義指令的控制器功能。要回答你的問題,是的,這是一個完全不同的控制器與你的方式,但... ...

  3. 要進入你的下一個點,你可以定義一個控制器像你在一個模塊#1,然後用它在你的指令:

在你的模塊:

module.controller('myController', function() {...}); 

在你的指令:

controller : 'myController' 

這使得像單元測試指令這樣的事情變得非常簡單,以及對問題的牢固分離。

  1. 這是指令需要與另一個指令進行通信的時候。指令的控制器功能基本上是它的API。因此,如果您在指令中需要另一條指令,則所需指令的控制器函數將作爲鏈接函數的第四個參數注入。

所以,在你的榜樣,爲myParentController控制器功能將被注入作爲第四個參數,以你的鏈接功能,所以你定義它是這樣的:

link : function (scope, element, attrs, myParentController) 

然後,在你的指令在執行要求時,您可以訪問在您要求的控制器的控制器功能上定義的任何功能。

希望有所幫助。

相關問題