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

时间:2016-12-29 21:35:11

标签: angularjs angularjs-directive

虽然之前已经提出过这个问题,但它对我不起作用。控制器变量" 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;
}

2 个答案:

答案 0 :(得分:1)

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

你的链接函数中的问题是你期望变量在范围内,但事实并非如此。它位于控制器上,位于示波器上。您。但是,链接函数的第四个注入是指令控制器,所以你可以像这样访问它:

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

唯一的打嗝是如果你require其他指令,那么你还需要你自己的指令控制器(我认为),而不是一个控制器,你将获得{{1链接函数中的控制器而不是一个。如果您从未使用过array,请不要担心我刚刚说过的内容,但如果您希望使用require,请将其保留在您的脑海中

编辑:以上信息仍然相关,可能对您有好处,但我刚刚想到, 为了让您的代码正常工作所必须做的就是添加{{1 }和require。这是你唯一缺少的两件事。

答案 1 :(得分:1)

您应该在MyWidgetCtrl的function SecurityController(){ 'ngInject'; const vm = this; vm.security = "secure"; } export default SecurityController; 上绑定您的变量:

import angular from 'angular';
import uiRouter from 'angular-ui-router';

import SecurityController from './securityController'
import SignUp from './services/signUpService';
import AuthenticationService from './services/authService'

const security = angular.module('security', [
    uiRouter,
]).controller(SecurityController)
    .service(SignUp)
    .service(AuthenticationService);

export default security.name;

否则,您应该使用bindToController方法,跳过$scope的使用。