AngularJS-无法访问另一个指令中的指令控制器
我有两个angularjs指令(extWindow和taskBar),希望将taskBar的控制器注入extWindow以访问其作用域。因为它们与我使用的范围不同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', []) .
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)。看看这个解决方案。是的,我想我对我的示例有点着迷了,但没有意识到,我的示例似乎依赖于作为父对象的主控件,而不是我所想的任务栏控制器。