指令链接函数中的AngularJS访问指令控制器变量

指令链接函数中的AngularJS访问指令控制器变量,angularjs,angularjs-directive,Angularjs,Angularjs Directive,虽然以前有人问过这个问题,但它对我不起作用。在调用link函数之前设置控制器变量“myVar”。根据文档和其他帖子,myVar应该在link函数中可用,但它不是。实际上,链接作用域包含一个父控制器引用,但没有对其自身控制器的引用???有什么想法吗 angular.module('app.main') .directive('myWidget', MyWidget) .controller('MyWidgetCtrl', MyWidgetCtrl) function MyWidg

虽然以前有人问过这个问题,但它对我不起作用。在调用link函数之前设置控制器变量“myVar”。根据文档和其他帖子,myVar应该在link函数中可用,但它不是。实际上,链接作用域包含一个父控制器引用,但没有对其自身控制器的引用???有什么想法吗

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