AngularJS-无法访问另一个指令中的指令控制器

AngularJS-无法访问另一个指令中的指令控制器,angularjs,scope,require,directive,Angularjs,Scope,Require,Directive,我有两个angularjs指令(extWindow和taskBar),希望将taskBar的控制器注入extWindow以访问其作用域。因为它们与我使用的范围不同 require : '^$directive' 包含它的语法。 这样我就可以消除指令“extWindow”所要求的“控制器”任务栏错误,但找不到该错误但在extWindow指令的link(..)方法中,TaskBarCtrl仍然是未定义的 有什么建议可以解决吗 var mod = angular.module('ui', []) .

我有两个angularjs指令(extWindow和taskBar),希望将taskBar的控制器注入extWindow以访问其作用域。因为它们与我使用的范围不同

require : '^$directive'
包含它的语法。 这样我就可以消除指令“extWindow”所要求的“控制器”任务栏错误,但找不到该错误但在extWindow指令的link(..)方法中,TaskBarCtrl仍然是未定义的

有什么建议可以解决吗

var mod = angular.module('ui', [])
.directive('taskBar', function() {

    var link = function(scope, el, attrs) { 
        $(el).css('display', 'block');
        $(scope.titles).each(function(i,t) {
            el.append('<span>' + t + '</span>')
        });
    };

    return {
        scope: {},
        restrict : 'E',
        controller: function($scope, $element, $attrs) {

            $scope.titles = [];

            this.addTitle = function(title) {               
                $scope.titles.push(w);
            };

            this.removeTitle = function(title) {
                $scope.titles = jQuery.grep(function(n,i) {
                    return title != n;
                });
            }
        },
        link: link
    };
}).directive('extWindow', function() {  

    return {
        scope: {},
        require: '^?taskBar',
        restrict: 'E',
        transclude: true,
        template: '<div class="ui-window">\
            <div class="ui-window-header"><span>{{windowTitle}}</span><div class="ui-window-close" ng-click="close()">X</div></div>\
            <div class="ui-window-content" ng-transclude></div>\
            </div>',
        link: function(scope, element, attrs, taskBarCtrl) {
            scope.windowTitle = attrs['windowTitle'];   
            scope.close = function() {
                $(element).css('display', 'none');
            }
            //taskBarCtrl is not recognized!!!
            taskBarCtrl.addTitle(scope.windowTitle);
        }
    }
});
var mod=angular.module('ui',[])
.directive('任务栏',函数()){
var link=函数(范围、el、属性){
$(el.css('display','block');
$(范围.标题)。每个(功能(i,t){
el.追加(“”+t+“”)
});
};
返回{
作用域:{},
限制:'E',
控制器:函数($scope、$element、$attrs){
$scope.titles=[];
this.addTitle=函数(title){
$scope.titles.push(w);
};
this.removeTitle=函数(标题){
$scope.titles=jQuery.grep(函数(n,i){
返回标题!=n;
});
}
},
链接:链接
};
}).directive('extWindow',function(){
返回{
作用域:{},
要求:“^?任务栏”,
限制:'E',
是的,
模板:'\
{{windowTitle}}X\
\
',
链接:函数(范围、元素、属性、taskBarCtrl){
scope.windowTitle=attrs['windowTitle'];
scope.close=函数(){
$(element.css('display','none');
}
//taskBarCtrl无法识别!!!
taskBarCtrl.addTitle(scope.windowTitle);
}
}
});

多谢各位。
golbie.

如果您有一个用于父指令的控制器,并且您需要类似的东西

this.scope = $scope;
this.attrs = $attrs;
在孩子的in-you-link函数中,你需要

var Ctrl = ctrl || scope.$parent.tBarCtrl;

当您将require与^symbol一起使用时,这里有一个

,您不是说taskBar指令必须是extWindow的父指令吗?我已经做了很多这样的指示,没有问题。不过,您需要排除父指令才能使其生效。嗨,dylan,谢谢您提供了这个漂亮且有效的示例,但我认为它需要讨论。让我解释一下我的发现。我需要做的第一件事是在模块中定义一个控制器。这对于指令是可见的(至少对于在相同范围内定义的那些控制器是可见的)并且可以由控制器“ctrl”引用。现在,第二个指令希望使用另一个指令的控制器,方法是使用require:“^”directivename。引用它还应使控制器在链接函数中可用。但控制器在“黄色”指令中不可用。另一方面,“红色”可以访问控制器,但在那里所做的更改没有填充到模板中。Thx。我终于找到了正确的解决方案。错误在于第二个指令没有被第一个指令包装。正如api文档中所述,“^?name”正在父级查找指令。由于两个指令都是同级指令,因此找不到该指令,因此taskBarCtrl未定义。指令之间通信的另一个解决方案是将控制器的外部功能传递给它们(&operator)。看看这个解决方案。是的,我想我对我的示例有点着迷了,但没有意识到,我的示例似乎依赖于作为父对象的主控件,而不是我所想的任务栏控制器。