指令链接函数中的AngularJS访问指令控制器变量
虽然以前有人问过这个问题,但它对我不起作用。在调用link函数之前设置控制器变量“myVar”。根据文档和其他帖子,myVar应该在link函数中可用,但它不是。实际上,链接作用域包含一个父控制器引用,但没有对其自身控制器的引用???有什么想法吗指令链接函数中的AngularJS访问指令控制器变量,angularjs,angularjs-directive,Angularjs,Angularjs Directive,虽然以前有人问过这个问题,但它对我不起作用。在调用link函数之前设置控制器变量“myVar”。根据文档和其他帖子,myVar应该在link函数中可用,但它不是。实际上,链接作用域包含一个父控制器引用,但没有对其自身控制器的引用???有什么想法吗 angular.module('app.main') .directive('myWidget', MyWidget) .controller('MyWidgetCtrl', MyWidgetCtrl) function MyWidg
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函数中的问题是,您希望变量在作用域中,但它不是。它在控制器上,在示波器上。你。但是,link函数的第四个可注入项是directives controller,因此您可以这样访问它:
link: function(scope, element, attrs, ctrl) {
var test = false;
test = ctrl.myVar;
}
唯一的问题是,如果你需要
其他指令,那么你还必须重新请求你自己的指令控制器(我想),而不是一个控制器,你将在你的链接函数中得到一个数组
。如果您从未使用过require
,请不要担心我刚才说的话,但请记住这一点,以防您想使用require
编辑:上面的信息仍然是相关的,可能对您来说很好阅读,但我突然想到,要使代码正常工作,您真正需要做的就是添加
bindToController:true
和controllerAs:'vm'
。这是你唯一缺少的两件事。你在这里混合了两种方法。在控制器中,您将把东西放在控制器实例上。只要在指令定义中指定bindToController:true
,它就可以正常工作。无论如何,这被认为是现在的最佳实践,原因有几个
link函数中的问题是,您希望变量在作用域中,但它不是。它在控制器上,在示波器上。你。但是,link函数的第四个可注入项是directives controller,因此您可以这样访问它:
link: function(scope, element, attrs, ctrl) {
var test = false;
test = ctrl.myVar;
}
唯一的问题是,如果你需要
其他指令,那么你还必须重新请求你自己的指令控制器(我想),而不是一个控制器,你将在你的链接函数中得到一个数组
。如果您从未使用过require
,请不要担心我刚才说的话,但请记住这一点,以防您想使用require
编辑:上面的信息仍然是相关的,可能对您来说很好阅读,但我突然想到,要使代码正常工作,您真正需要做的就是添加
bindToController:true
和controllerAs:'vm'
。这是您唯一缺少的两件事。您应该将变量绑定到MyWidgetCtrl的$scope
:
MyWidgetCtrl.$inject = ['$scope'];
function MyWidgetCtrl($scope) {
$scope.myVar = true;
}
否则,您应该使用这种方法,要跳过
$scope
的使用,您应该将变量绑定到MyWidgetCtrl的$scope
:
MyWidgetCtrl.$inject = ['$scope'];
function MyWidgetCtrl($scope) {
$scope.myVar = true;
}
否则,您应该使用这种方法,跳过
$scope
的使用,如果他想在link函数中访问他的控制器,他需要使用bindToController
和controllerAs
来命名它将绑定到作用域上的变量,对吗?然后可以从链接函数ctrls
中的第四个属性访问指令的控制器对象,如var hisCtrl=ctrls[0]代码>是,但如果他使用DDO上的require
字段,情况会变得更复杂。我认为命名它并将其放入范围更容易。不管怎样,我相信这就是正在发生的事情。好吧,你应该避免$scope对象和它上面添加的任何东西。它在Angular 1.6中被完全删除,在2.0中不存在。但这正是bindToController
所做的。它只是将控制器放在$scope
上。例如,您可以在控制器中访问vm
的唯一原因是,控制器作为vm
在作用域中。对吗?如果他想在链接函数中访问他的控制器,他需要使用bindToController
和controllerAs
来命名它将绑定到作用域上的变量,对吗?然后可以从链接函数ctrls
中的第四个属性访问该指令的控制器对象,如var hisCtrl=ctrls>[0]是的,但如果他在DDO上使用require
字段,情况会变得更复杂。我认为简单地命名它并将其放在作用域上会更容易。我相信这就是正在发生的事情。你应该避免使用$scope对象和任何添加的对象。它在Angular 1.6中完全删除,在2.0中不存在。但这正是事实bindToController
正在做什么。它只是将控制器放在$scope
上。例如,您可以在控制器中访问vm
的唯一原因是因为控制器作为vm
在作用域上。对吗?是的,这对我有效,使用您在编辑中的建议,thxYes对我有效,使用您r编辑中的建议,thx