我记下了this jsFiddle以复制我的方案。
我基本上通过ui-router
在我的页面上<div>
内加载了此视图,并使用$state.go
加载它。指令的控制器应该正在监听名为myEvent:<scope.$id>
的事件(例如,在其中myEvent:2
),而外部视图应该触发只是那个事件,因为它加载了正确的$stateParams.scopeId
(从相应的$scope.ev
属性可以看出)。此外,我正在使用$scope.$emit
,因为我收集了外部视图具有更高$scope.$id
的事实,事件应该向上传播并最终到达指令的范围并被捕获,或者我遗漏了什么?欢呼声。
更新:我设法通过添加以下内容来实现:
.controller("MyCtrl", ["$scope", function($scope) {
$scope.$root.$on("myEvent:2", function(e, data) {
$scope.$broadcast("myEvent:2", data);
});
}])
(参见fiddle),因为我认为外部视图的scope
可能不是指令scope
的孩子;相反,他们有一个共同的祖先,当然$rootScope
会做得很好。所以我$emit
将事件一直发送到$rootScope
并$broadcast
向下发回。现在的问题是我必须对事件名称进行硬编码,这是一个主要的交易破坏者,因为我事先并不知道该指令的scope.$id
;没有办法让参数或基于正则表达式的事件名称如下:
.controller("MyCtrl", ["$scope", function($scope) {
$scope.$root.$on("myEvent:(\d+)", function(e, data) {
$scope.$broadcast("myEvent:" + RegExp.$1, data);
});
}])
答案 0 :(得分:0)
得到它:fiddle。诀窍是$emit
来自视图的通用事件,并将正确的$scope.$id
传递给事件数据。在$rootScope
上,提取id
并使用它来形成重新传播的正确事件名称。