是否有可能在$ on内广播? angularjs

时间:2016-02-17 17:05:08

标签: html angularjs

我在三个不同指令的父控制器中,并且我试图在事件上向子节目(指令'控制器)广播。

我在父控制器中尝试了以下操作,但无效。

<form:form role="form" method="post" commandName="kokenHelper" action="../formAction" id="formId">
    <c:forEach var="wat" items="${kokenHelper.kokenList}" >
</form:form>

由于这不起作用,我在指令的控制器中执行了以下操作,而不是收听上述广播:

 $scope.$on('tracking', function(e, data){
    //set it to open by default since that is the default case.
    if($scope.switchBackToOpen === undefined) {
      $scope.switchBackToOpen = true;
    }
    $scope.switchBackToOpen = data;
    $scope.$broadcast('switch back', $scope.switchBackToOpen);
  });

如果在vm.func = function(){ if($scope.$parent.switchBackToOpen) { //communicate with a sibling directive $scope.$root.$broadcast('set status back to open'); } }; 内无法$broadcast,那么解决这个问题的最有效方法是什么?

编辑更多父母/子女关系结构:

当在一个嵌套指令中单击div时,我正在尝试与父控制器通信以通过父控制器内的变量捕获是否为“打开”页面。然后我想从这个父控制器发送变量,让所有嵌套的指令都可以访问它(我的第二个代码块是我想要访问父控制器变量的指令)。

1 个答案:

答案 0 :(得分:1)

您不希望广播一个事件来通过范围进行传播并被父母捕获。相反,您希望将父变量绑定到子指令。即使你的指令具有隔离范围,你也可以这样做。

让我们假设您的HTML是这样的:

<div ng-controller='parentCtrl'>
  <div my-child dirclick='childEvent'>

  </div>
  <div my-child dirclick='childEvent'>

  </div>
</div>

你的parentCtrl是这样的:

.controller('parentCtrl',function($scope){
  $scope.childEvent = function(){
    //some code
  }
})

所以你的指令应该是这样的:

.directive('myChild',function(){
  return {
    template : "<button ng-click='clickme()'>clickme</button>",
    scope : {clickme : '=dirclick'},
    restrict : 'A',

(我没有为指令编写完整的代码,所以请等待它)

现在,无论您在child指令的dirclick属性中写入什么,都将绑定到parentCtrl的名为childEvent的对象。并且它将绑定到您的指令的clickme。现在,您可以从子指令的clickme()fn中调用parentCtrl的childEvent()函数。 (我很难解释,最好看下面的代码)

你现在喜欢做任何广播。因此声明parentCtrl的childEvent()fn如下:

$scope.childEvent = function(){
  $scope.$broadcast('child event',{say:"hello"});
}

并像这样定义你的孩子指令的控制器:

controller : function($scope){
    $scope.$on('child event',function(event,data){
    alert(data.say);
  });
}

这可能有助于您解决问题。

请找相关的小提琴:https://jsfiddle.net/Lo7ehrdn/1/

建议 - 当它从顶部到你的所有孩子范围下降时,不要玩$ broadcast。如果您绘制一个树,其中您的根是父作用域,则广播将向下运行到最后一个叶子。

希望这有帮助。