Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度指令-需要从指令控制器访问所需控制器_Javascript_Angularjs_Angular Directive - Fatal编程技术网

Javascript 角度指令-需要从指令控制器访问所需控制器

Javascript 角度指令-需要从指令控制器访问所需控制器,javascript,angularjs,angular-directive,Javascript,Angularjs,Angular Directive,我正在编写一个角度“tab”指令,它需要通过向父指令发送对自身的引用来与父指令“tabs”进行通信 我试图将代码保存在指令的控制器中,而不是link函数中,因为我并没有真正使用DOM 问题是,如果我使用{require:'^tabs'},我可以像这样获得所需指令的控制器的副本 link: function(scope, element, attr, ctrls) { var controller = ctrls[0]; } 但是在指令的控制器函数中,我该如何做呢?这对我来说总是一个有趣

我正在编写一个角度“tab”指令,它需要通过向父指令发送对自身的引用来与父指令“tabs”进行通信

我试图将代码保存在指令的控制器中,而不是link函数中,因为我并没有真正使用DOM

问题是,如果我使用{require:'^tabs'},我可以像这样获得所需指令的控制器的副本

link: function(scope, element, attr, ctrls) {
    var controller = ctrls[0];
}

但是在指令的控制器函数中,我该如何做呢?

这对我来说总是一个有趣的问题。我喜欢认为我对这个常见案例的解决方案是在玩弄野性

首先,我回到controllerAs视图语法,如angular style guide()中所建议的

使用此语法,您可以将指令定义为:

    var directive = {
        require: '^myParentDirective',
        restrict: 'EA',
        controller: 'MyController as myCtrl',
        templateUrl: 'super/awesome/app/my/my.directive.html',
        scope: {
            myProp: '='
        }, // isolate scope
        link: link
    };

    function link(scope, element, attr, myParentCtrl) {

        scope.myCtrl.myParent = myParentCtrl;

    }
捕获(总是有捕获):

请记住,指令的控制器是在调用link函数之前构造的。因此,您不能期望在控制器构造期间执行的代码中解析myParent属性

function MyController($scope) {

    var _self = this;

    _self.myParent.register(_self); // myParent is not defined

}
而是等到您确定myParent已解决

function MyController(scope) {

    var _self = this;

    _self.initialize = initialize;

    return;

    function initialize() {

        _self.myParent.register(_self); // myParent might be defined

    }

}
然后做一些类似的事情

function link(scope, element, attr, myParentCtrl) {

    scope.myCtrl.myParent = myParentCtrl;

    scope.myCtrl.initialize();

}
让我知道这是否有帮助,是否偏离基准,或者您是否需要更多的澄清


(另外,请原谅语法错误)

通常,如果需要在控制器之间共享数据,可以创建工厂/服务来存储数据,并将服务注入这些控制器中。服务中的数据集将是单例的

angular.module('myApp', [])
  .factory('myService', function() {
    var myData;
    return {
      getData: function () {
        return this.myData;
      },
      setData: function (data) {
        this.myData = data;
      }
    }
  .controller('controller1', function(myService) {
  })
  .controller('controller2', function(myService) {
  })
});
如果子指令没有范围数据,还可以将指令范围设置为false,它将继承父控制器的范围

angular.module('myApp', [])
.directive('myDirective', function() {
  return {
    restrict: 'E',
    scope: false,
    controller: 'controller1'
  };
});

我相信你必须在链接中这样做,因为require完成的控制器查找在DOM中搜索指令及其各自的控制器。谢谢dannielum,但对于我目前的问题,我认为单例不起作用。谢谢,这就是我正在尝试做的。唯一的区别是我需要在register方法中传递$scope,而不是因为父目录需要访问scope方法和$destroy等,除非我误解了。