AngularJS事件处理程序内部指令不触发/参数事件名称

时间:2015-08-31 09:05:09

标签: javascript angularjs angularjs-directive event-handling

我记下了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);
    });
}])

1 个答案:

答案 0 :(得分:0)

得到它:fiddle。诀窍是$emit来自视图的通用事件,并将正确的$scope.$id传递给事件数据。在$rootScope上,提取id并使用它来形成重新传播的正确事件名称。