2016-12-29 93 views
0

虽然以前有人问过这个问题,但它不适用于我。控制器变量“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; 
} 

回答

1

你在这里混合两种方法。在您的控制器中,您将的东西放在控制器实例上。只要你在你的指令定义中指定了bindToController: true,它就可以正常工作。无论如何,这被认为是最佳做法,原因有几个。

链接函数中的问题是,您期望变量位于作用域上,但事实并非如此。它在控制器上,在范围内。您。然而,链接功能的第四注射是的指令控制器,这样你就可以像这样访问:

link: function(scope, element, attrs, ctrl) { 
    var test = false; 
    test = ctrl.myVar; 
} 

在这唯一的打嗝是,如果你require其他指令,那么你也必须reqire你自己的指令控制器(我认为),而不是单个控制器,您将在链接功能中获得控制器的array而不仅仅是一个。如果您从未使用过require,请不要担心我刚才所说的内容,但请将其放在后面,以防您想要使用require

编辑:以上信息仍然是相关的,而且很可能对你有好处阅读,但它只是发生,我认为你真的做才能让你的代码工作是添加bindToController: truecontrollerAs: 'vm'。这是你唯一缺少的两件事。

+0

是的,这对我工作,在编辑中使用你的建议,thx – nuander

1

您应该将变量绑定在MyWidgetCtrl的$scope

MyWidgetCtrl.$inject = ['$scope']; 
function MyWidgetCtrl($scope) { 
    $scope.myVar = true; 
} 

否则,你应该使用bindToController方式,跳过$scope的使用。

+0

如果他想访问他的控制器的链接功能,但他需要使用'bindToController' *和*'controllerAs'来命名它将绑定的变量在范围内,对吗? –

+0

然后,可以从链接函数'ctrls'中的第四个属性访问该指令的控制器对象,如'var hisCtrl = ctrls [0];' – tomepejo

+0

是的,但是如果他使用DDO。我认为只要将其命名并将其放在范围内就比较容易。无论如何,这是发生了什么,我相信。 –

相关问题