我试图"要求"父控制器(非指令)但AngularJS返回异常。代码是这样的:
app.controller("myController", function ($scole) {
...
});
app.directive("myDirective", function ($q) {
return {
require: "^myController",
template: "",
link: function (scope, element, attrs, myCtrl) {
...
}
};
});
<div ng-controller="myController as myCtrl">
...
<div my-directive>...</div>
...
</div>
错误:[$ compile:ctreq]控制器&#39; myController&#39;,需要 指令&#39; myDirective&#39;,无法找到!
为什么?
也许,require
属性必须引用指令的控制器?
由于
答案 0 :(得分:7)
要求在另一个指令中使用其他指令控制器,请参考以下示例
var App = angular.module('myApp',[]);
//one directive
App.directive('oneDirective',function(){
return {
restrict: 'E',
controller:function($scope){
$scope.myName= function(){
console.log('myname');
}
}
}
});
//two directive
App.directive('twoDirective',function(){
return {
require:'oneDirective' //one directive used,
link : function(scope,ele,attrs,oneCtrl){
console.log(oneCtrl.myName())
}
}
})
答案 1 :(得分:5)
表示法require: "^myController"
表示您的指令将尝试访问另一个名为myController
的指令,并在某些祖先标记上定义为my-controller
属性或<my-controller>
标记。在你的情况下,你没有这样的指令,因此例外。
这不是你想要做的非常传统,但是如果真的想要在你的指令中要求外部控制器,你可以要求ngController
:
app.directive("myDirective", function($q) {
return {
require: "^ngController",
template: "",
link: function(scope, element, attrs, myCtrl) {
// ...
console.log(myCtrl);
}
};
});
然而,这不是一个好主意。我无法想象你为什么会这样需要它。我建议查看scope
配置属性以及如何将可执行函数引用从外部控制器传递到指令中。
<div my-directive some-callback="test()"></div>
并在指令中定义范围:
scope: {
someCallback: '&'
}
在控制器中,您将拥有$scope.test = function() {};
。然后你不需要在指令中明确要求控制器。