Javascript 如何访问require';从另一个控制器中删除控制器?
我有一个Angular 1.3模块,看起来像这样(指令要求存在父指令,使用Javascript 如何访问require';从另一个控制器中删除控制器?,javascript,angularjs,angular-directive,Javascript,Angularjs,Angular Directive,我有一个Angular 1.3模块,看起来像这样(指令要求存在父指令,使用controllerAs): 这里我只是使用$scope来传递parentDirectiveCtrl,这似乎有点笨拙 是否有其他方法可以从指令的控制器访问require-ed控制器而不使用链接功能?您必须使用link功能来获取require-ed控制器,但无需使用作用域将控制器的引用传递给您自己的控制器。而是直接将其传递给您自己的控制器: .directive('fooDirective', function () {
controllerAs
):
这里我只是使用$scope
来传递parentDirectiveCtrl
,这似乎有点笨拙
是否有其他方法可以从指令的控制器访问
require
-ed控制器而不使用链接功能?您必须使用link
功能来获取require
-ed控制器,但无需使用作用域将控制器的引用传递给您自己的控制器。而是直接将其传递给您自己的控制器:
.directive('fooDirective', function () {
return {
require: ["fooDirective", "^parentDirective"],
link: function link(scope, element, attrs, ctrls) {
var me = ctrls[0],
parent = ctrls[1];
me.parent = parent;
},
controller: function(){...},
};
});
但是,要小心,因为控制器在链接之前运行,所以在控制器中,父级是未定义的,直到链接函数运行之后。如果您需要确切地知道何时发生这种情况,则始终可以使用控制器函数将parentDirective
控制器传递给:
link: function link(scope, element, attrs, ctrls) {
//...
me.registerParent(parent);
},
controller: function(){
this.registerParent = function(parent){
//...
}
}
有一种方法可以避免使用$scope
访问父控制器,但您必须使用链接
功能。
Angular的文件:
要求
需要另一个指令并将其控制器作为第四个指令注入
链接函数的参数
选项1
由于controllerAs
在控制器的scope
中创建名称空间,因此您可以在链接
函数中访问此名称空间,并将所需控制器直接放置在childDirective
的控制器上,而不是使用$scope
。然后代码将如下所示
angular.module('app', []).
controller('parentController', function() {
this.doSomething = function() {
alert('parent');
};
}).
controller('childController', function() {
this.click = function() {
this.parentDirectiveCtrl.doSomething();
}
}).
directive('parentDirective', function() {
return {
controller: 'parentController'
}
}).
directive('childDirective', function() {
return {
template: '<button ng-click="controller.click()">Click me</button>',
link: function link(scope, element, attrs, parentDirectiveCtrl) {
scope.controller.parentDirectiveCtrl = parentDirectiveCtrl;
},
controller: 'childController',
controllerAs: 'controller',
bindToController: true,
require: '^parentDirective'
}
});
angular.module('app',[])。
控制器('parentController',函数(){
this.doSomething=函数(){
警报(“父级”);
};
}).
控制器('childController',函数(){
this.click=函数(){
this.parentDirectiveCtrl.doSomething();
}
}).
指令('parentDirective',函数(){
返回{
控制器:“父控制器”
}
}).
指令('childDirective',函数(){
返回{
模板:“单击我”,
链接:函数链接(范围、元素、属性、parentDirectiveCtrl){
scope.controller.parentDirectiveCtrl=parentDirectiveCtrl;
},
控制器:“childController”,
控制器:“控制器”,
bindToController:对,
要求:“^parentDirective”
}
});
Plunker:
选项2
我通常在指令中根本不使用控制器,而是通过服务共享功能。如果您不需要处理父指令和子指令的独立作用域,只需将相同的服务注入这两个指令,并将所有功能投入服务即可
angular.module('app', []).
service('srv', function() {
this.value = '';
this.doSomething = function(source) {
this.value = source;
}
}).
directive('parentDirective', ['srv', function(srv) {
return {
template: '<div>' +
'<span ng-click="srv.doSomething(\'parent\')">Parent {{srv.value}}</span>' +
'<span ng-transclude></span>' +
'</div>',
transclude: true,
link: function(scope) { scope.srv = srv; }
};
}]).
directive('childDirective', ['srv', function(srv) {
return {
template: '<button ng-click="srv.doSomething(\'child\')">Click me</button>',
link: function link(scope) { scope.srv = srv; }
}
}]);
angular.module('app',[])。
服务('srv',函数(){
这个值=“”;
this.doSomething=函数(源){
this.value=来源;
}
}).
指令('parentDirective',['srv',函数(srv){
返回{
模板:“”
'父{srv.value}}'+
'' +
'',
是的,
链接:函数(范围){scope.srv=srv;}
};
}]).
指令('childDirective',['srv',函数(srv){
返回{
模板:“单击我”,
链接:函数链接(范围){scope.srv=srv;}
}
}]);
Plunker
问得好!角度允许您通过“父”控制器。您已经将其作为链接函数的参数。这是第四个参数。为了简单起见,我把它命名为ctrl。您不需要现有的scope.parentDirectiveCtrl=parentDirectiveCtrl行
.directive('fooDirective', function () {
return {
// Passing in parentDirectiveCtrl into $scope here
link: function link(scope, element, attrs, ctrl) {
// What you had here is not required.
},
controller: 'FooController',
controllerAs: 'controller',
bindToController: true,
require: '^parentDirective'};});
现在,在您的父控制器上
this.doSomething=function().
您可以通过以下方式访问此剂量仪:
ctrl.doSomething().
您不必通过作用域传递它-您可以将其分配给您自己的控制器…但是,是的-您需要一个链接功能分配它是什么意思?您需要您自己的控制器和一个父控制器<代码>要求:[“foodirection”、“^parentDirective”]
。。。并将一个分配给另一个。。。但是它仍然需要一个link函数——这就是注入所需控制器的地方。如果你想要声誉积分,请将其作为答案发布,我会接受。谢谢我对此进行了一次尝试,并意识到当存在多个指令实例时,它将不起作用,因为服务是单例的。这可以在编译部分注入吗?
ctrl.doSomething().