Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.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 如何访问require';从另一个控制器中删除控制器?_Javascript_Angularjs_Angular Directive - Fatal编程技术网

Javascript 如何访问require';从另一个控制器中删除控制器?

Javascript 如何访问require';从另一个控制器中删除控制器?,javascript,angularjs,angular-directive,Javascript,Angularjs,Angular Directive,我有一个Angular 1.3模块,看起来像这样(指令要求存在父指令,使用controllerAs): 这里我只是使用$scope来传递parentDirectiveCtrl,这似乎有点笨拙 是否有其他方法可以从指令的控制器访问require-ed控制器而不使用链接功能?您必须使用link功能来获取require-ed控制器,但无需使用作用域将控制器的引用传递给您自己的控制器。而是直接将其传递给您自己的控制器: .directive('fooDirective', function () {

我有一个Angular 1.3模块,看起来像这样(指令要求存在父指令,使用
controllerAs
):

这里我只是使用
$scope
来传递
parentDirectiveCtrl
,这似乎有点笨拙


是否有其他方法可以从指令的控制器访问
require
-ed控制器而不使用链接功能?

您必须使用
link
功能来获取
require
-ed控制器,但无需使用作用域将控制器的引用传递给您自己的控制器。而是直接将其传递给您自己的控制器:

.directive('fooDirective', function () {
  return {

    require: ["fooDirective", "^parentDirective"],

    link: function link(scope, element, attrs, ctrls) {
      var me     = ctrls[0],
          parent = ctrls[1];

      me.parent = parent;
    },
    controller: function(){...},
  };
});
但是,要小心,因为控制器在链接之前运行,所以在控制器
中,父级
未定义的
,直到链接函数运行之后。如果您需要确切地知道何时发生这种情况,则始终可以使用控制器函数将
parentDirective
控制器传递给:

link: function link(scope, element, attrs, ctrls) {
  //...

  me.registerParent(parent);
},
controller: function(){
  this.registerParent = function(parent){
    //...
  }
}

有一种方法可以避免使用
$scope
访问父控制器,但您必须使用
链接
功能。 Angular的文件:

要求

需要另一个指令并将其控制器作为第四个指令注入 链接函数的参数

选项1

由于
controllerAs
在控制器的
scope
中创建名称空间,因此您可以在
链接
函数中访问此名称空间,并将所需控制器直接放置在
childDirective
的控制器上,而不是使用
$scope
。然后代码将如下所示

angular.module('app', []).
  controller('parentController', function() {
    this.doSomething = function() {
      alert('parent');
    };
  }).
  controller('childController', function() {
    this.click = function() {
      this.parentDirectiveCtrl.doSomething();
    }
  }).
  directive('parentDirective', function() {
    return {
      controller: 'parentController'
    }
  }).
  directive('childDirective', function() {
    return {
      template: '<button ng-click="controller.click()">Click me</button>',
      link: function link(scope, element, attrs, parentDirectiveCtrl) {
        scope.controller.parentDirectiveCtrl = parentDirectiveCtrl;
      },
      controller: 'childController',
      controllerAs: 'controller',
      bindToController: true,
      require: '^parentDirective'
    }
  });
angular.module('app',[])。
控制器('parentController',函数(){
this.doSomething=函数(){
警报(“父级”);
};
}).
控制器('childController',函数(){
this.click=函数(){
this.parentDirectiveCtrl.doSomething();
}
}).
指令('parentDirective',函数(){
返回{
控制器:“父控制器”
}
}).
指令('childDirective',函数(){
返回{
模板:“单击我”,
链接:函数链接(范围、元素、属性、parentDirectiveCtrl){
scope.controller.parentDirectiveCtrl=parentDirectiveCtrl;
},
控制器:“childController”,
控制器:“控制器”,
bindToController:对,
要求:“^parentDirective”
}
});
Plunker

选项2

我通常在指令中根本不使用控制器,而是通过服务共享功能。如果您不需要处理父指令和子指令的独立作用域,只需将相同的服务注入这两个指令,并将所有功能投入服务即可

angular.module('app', []).
  service('srv', function() {
    this.value = '';
    this.doSomething = function(source) {
      this.value = source;
    }
  }).
  directive('parentDirective', ['srv', function(srv) {
    return {
      template: '<div>' + 
                  '<span ng-click="srv.doSomething(\'parent\')">Parent {{srv.value}}</span>' +
                  '<span ng-transclude></span>' +
                '</div>',
      transclude: true,
      link: function(scope) { scope.srv = srv; }
    };
  }]).
  directive('childDirective', ['srv', function(srv) {
    return {
      template: '<button ng-click="srv.doSomething(\'child\')">Click me</button>',
      link: function link(scope) { scope.srv = srv; }
    }
  }]);
angular.module('app',[])。
服务('srv',函数(){
这个值=“”;
this.doSomething=函数(源){
this.value=来源;
}
}).
指令('parentDirective',['srv',函数(srv){
返回{
模板:“”
'父{srv.value}}'+
'' +
'',
是的,
链接:函数(范围){scope.srv=srv;}
};
}]).
指令('childDirective',['srv',函数(srv){
返回{
模板:“单击我”,
链接:函数链接(范围){scope.srv=srv;}
}
}]);
Plunker


问得好!角度允许您通过“父”控制器。您已经将其作为链接函数的参数。这是第四个参数。为了简单起见,我把它命名为ctrl。您不需要现有的scope.parentDirectiveCtrl=parentDirectiveCtrl行

.directive('fooDirective', function () {
  return {
// Passing in parentDirectiveCtrl into $scope here
link: function link(scope, element, attrs, ctrl) {
  // What you had here is not required.
},
controller: 'FooController',
controllerAs: 'controller',
bindToController: true,
require: '^parentDirective'};});
现在,在您的父控制器上

this.doSomething=function(). 
您可以通过以下方式访问此剂量仪:

ctrl.doSomething().

您不必通过作用域传递它-您可以将其分配给您自己的控制器…但是,是的-您需要一个链接功能分配它是什么意思?您需要您自己的控制器和一个父控制器<代码>要求:[“foodirection”、“^parentDirective”]
。。。并将一个分配给另一个。。。但是它仍然需要一个link函数——这就是注入所需控制器的地方。如果你想要声誉积分,请将其作为答案发布,我会接受。谢谢我对此进行了一次尝试,并意识到当存在多个指令实例时,它将不起作用,因为服务是单例的。这可以在编译部分注入吗?
ctrl.doSomething().