我在三个不同指令的父控制器中,并且我试图在事件上向子节目(指令'控制器)广播。
我在父控制器中尝试了以下操作,但无效。
<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时,我正在尝试与父控制器通信以通过父控制器内的变量捕获是否为“打开”页面。然后我想从这个父控制器发送变量,让所有嵌套的指令都可以访问它(我的第二个代码块是我想要访问父控制器变量的指令)。
答案 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。如果您绘制一个树,其中您的根是父作用域,则广播将向下运行到最后一个叶子。
希望这有帮助。