我在过去几天里已经阅读了很多关于指令和控制器之间连接的内容。我已经做了一些观察,但我很难将它们放在一起,并且可以使用一些指导。
我看到控制器和指令混合的方式大约有四五种。
鉴于:
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)控制器被指定为app中单独控制器的名称。我不确定这两个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
});
答案 0 :(得分:2)
您列出的互动方式有很多种,但我会在这里总结一下:
这说明了创建模块并向该模块添加指令和控制器。在这种情况下,它们不会相互交互,而是与模块本身相互作用。 .directive
和.controller
的返回值是模块,因此链接来自。
在这种情况下,您将定义指令的控制器功能。要回答你的问题,是的,这是一个与你拥有它的方式完全不同的控制器,但是....
要进入下一点,您可以像在#1中一样在模块上定义控制器,然后在指令中使用它:
在你的模块中:
module.controller('myController', function () {...});
在你的指令中:
controller : 'myController'
这使得单元测试指令变得非常简单,并且可以将问题牢固地分开。
因此,在您的示例中,myParentController
的控制器函数将作为链接函数的第四个参数注入,因此您可以像这样定义它:
link : function (scope, element, attrs, myParentController)
然后,在执行要求的指令中,您可以访问在您需要的控制器的控制器功能上定义的任何功能。
希望有所帮助。