AngularJS访问指令控制器变量的指令链接功能
虽然以前有人问过这个问题,但它不适用于我。控制器变量“myVar”在链接函数被调用之前设置。根据文档和其他帖子,myVar应该在链接功能中可用,但事实并非如此。实际上,链接作用域包含一个父控制器引用,但没有引用它自己的控制器?有任何想法吗?AngularJS访问指令控制器变量的指令链接功能
angular.module('app.main')
.directive('myWidget', MyWidget)
.controller('MyWidgetCtrl', MyWidgetCtrl)
function MyWidget() {
return {
restrict: 'E',
templateUrl: 'my-widget-tmpl.html',
controller: MyWidgetCtrl,
link: function (scope, element, attrs) {
var test = false;
test = myVar; // doesn't work
test = scope.myVar; // doesn't work
test = scope.vm.myVar; // doesn't work
}
};
}
MyWidgetCtrl.$inject = ['$scope'];
function MyWidgetCtrl($scope) {
var vm = this;
vm.myVar= true;
}
你在这里混合两种方法。在您的控制器中,您将的东西放在控制器实例上。只要你在你的指令定义中指定了bindToController: true
,它就可以正常工作。无论如何,这被认为是最佳做法,原因有几个。
链接函数中的问题是,您期望变量位于作用域上,但事实并非如此。它在控制器上,在范围内。您。然而,链接功能的第四注射是的指令控制器,这样你就可以像这样访问:
link: function(scope, element, attrs, ctrl) {
var test = false;
test = ctrl.myVar;
}
在这唯一的打嗝是,如果你require
其他指令,那么你也必须reqire你自己的指令控制器(我认为),而不是单个控制器,您将在链接功能中获得控制器的array
而不仅仅是一个。如果您从未使用过require
,请不要担心我刚才所说的内容,但请将其放在后面,以防您想要使用require
。
编辑:以上信息仍然是相关的,而且很可能对你有好处阅读,但它只是发生,我认为你真的有做才能让你的代码工作是添加bindToController: true
和controllerAs: 'vm'
。这是你唯一缺少的两件事。
您应该将变量绑定在MyWidgetCtrl的$scope
:
MyWidgetCtrl.$inject = ['$scope'];
function MyWidgetCtrl($scope) {
$scope.myVar = true;
}
否则,你应该使用bindToController方式,跳过$scope
的使用。
如果他想访问他的控制器的链接功能,但他需要使用'bindToController' *和*'controllerAs'来命名它将绑定的变量在范围内,对吗? –
然后,可以从链接函数'ctrls'中的第四个属性访问该指令的控制器对象,如'var hisCtrl = ctrls [0];' – tomepejo
是的,但是如果他使用DDO。我认为只要将其命名并将其放在范围内就比较容易。无论如何,这是发生了什么,我相信。 –
是的,这对我工作,在编辑中使用你的建议,thx – nuander