Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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
Angularjs指令require未找到父指令控制器_Angularjs_Controller_Directive - Fatal编程技术网

Angularjs指令require未找到父指令控制器

Angularjs指令require未找到父指令控制器,angularjs,controller,directive,Angularjs,Controller,Directive,当我在指令中需要一个控制器时,我得到的错误是,无法找到控制器。 请参阅下面带有问题的代码。 有人能看一下吗 谢谢您应该使用服务在他们之间进行通信。具体如何/做什么取决于你的具体需求(你的帖子中没有足够的信息) 旁注,我将您的点击处理程序更改为ng点击 下面是一个例子: angular.module('mymodule',[]) .controller('mainCtrl',['$scope', 职能($范围){ $scope.test=“主角度正在工作”; } ]).controller(

当我在指令中需要一个控制器时,我得到的错误是,无法找到控制器。 请参阅下面带有问题的代码。

有人能看一下吗


谢谢

您应该使用服务在他们之间进行通信。具体如何/做什么取决于你的具体需求(你的帖子中没有足够的信息)

旁注,我将您的点击处理程序更改为ng点击

下面是一个例子:


angular.module('mymodule',[])
.controller('mainCtrl',['$scope',
职能($范围){
$scope.test=“主角度正在工作”;
}
]).controller('searchResultFilterController'、['$scope'、'myService',
功能($scope,myService){
//用“我的服务”做点什么
}
])
.directive('searchResultFilter'[
函数(){
返回{
替换:正确,
控制器:“searchResultFilterController”,
模板:“这是第一条指令”
};
}
])
.directive('searchResultHeader',['myService',
功能(myService){
返回{
替换:正确,
模板:“单击我”,
链接:函数($scope、$elem、$attrs){
$scope.doClick=function(){
myService.someFn();
};
}
};
}
])
.service('myService',function()){
this.someFn=函数(){
警报(“这正在工作”);
};
});

当您的指令与相关时,您应该使用
require
:如手风琴和手风琴项目

要在作用域之间进行通信,应尝试$on、$emit、$BROADIC。在您的情况下,您需要将rootScope注入到指令中,并从rootScope广播一个事件:

.directive('searchResultHeader', 

    function($rootScope) { //inject rootScope
      return {
        replace: true,
        template: '<button>clickme</button>',
        link: function($scope, $elem, $attrs) {
          $elem.on('click', function() {
            $rootScope.$broadcast("someEvent"); //broadcast an event to all child scopes.
          });
        }
      };
    }
  );
使用事件是创建解耦系统的一种方法


只有当控制器具有父子关系时,才可以要求控制器。请参阅更新的plunk@KhanhTO:谢谢。所以,如果我想在两个兄弟指令之间进行通信,我该怎么做?是的。我们可以这样使用。但是,这是一个好方法吗?我想,angular并不是建议使用广播或发射太多,对吧?@Jintopy:这个问题有两种解决方案:使用事件和使用服务。使用哪个取决于我们的应用程序。当作用域之间有一些
共享的
属性时,我们使用服务=>当另一个作用域修改这些
共享的
属性时,所有其他作用域都会注意到这些更改。在其他情况下,我们使用事件。我不认为angular不建议使用广播或发射太多,它应该取决于上下文。@jintoppy:如果您的指令没有任何可共享的内容。我会使用事件来创建一个更加解耦的系统。我个人非常谨慎地使用事件,并且只在非常特定的情况下使用。例如,我目前正在处理的应用程序中使用的唯一事件是通知应用程序的其余部分已发生配置更改,以便每个感兴趣的部分都可以更新自己的配置。@Craig Squire:事实上,事件驱动非常有用。这是一种创建解耦系统的方法,因为组件
不必直接依赖于其他组件。谢谢您的回答。当我们这样使用时,我们只是将服务作为中间人来使用,对吗?我想要这些指令之间的双向通信。因此,如果在directive1上单击一个按钮,则在directive2上应该会发生一些操作,反之亦然。那么,如果我们正在使用一项服务,我们该怎么做呢?刚刚看到你的评论。再说一遍,这完全取决于你在做什么。假设您希望directive1(D1)对directive2(D2)拾取的某个值进行更改。例如,D1调用服务上的函数来更改某些值,而D2在服务的一个属性上设置了$watch。查看这篇关于使用$watch的3个变体的博客文章。当服务上的值更改时,您可以使用相同的方法让D2调用函数。
.directive('searchResultHeader', 

    function($rootScope) { //inject rootScope
      return {
        replace: true,
        template: '<button>clickme</button>',
        link: function($scope, $elem, $attrs) {
          $elem.on('click', function() {
            $rootScope.$broadcast("someEvent"); //broadcast an event to all child scopes.
          });
        }
      };
    }
  );
function($scope) {
      $scope.$on("someEvent", function() { 
          alert('this is working');
      });
    }