AngularJs:通过$ emit在指令之间传播事件

时间:2014-02-03 08:34:09

标签: angularjs angularjs-directive angularjs-scope

我在一个控制器下有两个指令:

<div ng-controller="ctrl">
   <div data-dy-items-list items="items"></div>           // FIRST DIRECTIVE
   <div data-dy-subitems-list subitems="subitems"></div>  //SECON DIRECTIVE
</div>

在Second指令模板中,我有一个按钮,在控制器部分的directive.js文件中我这样做了:

$scope.clickButton= function () {
 ......
$scope.$emit("UPDATE_PARENT","updated");

}

在第一个指令中,我想在控制器部分执行此操作:

$scope.update = false;
    $scope.$on("UPDATE_PARENT", function (event,message){
                    $scope.update = true;
                    console.log('update: ' + $scope.update);
                });

但它不起作用!!!

2 个答案:

答案 0 :(得分:7)

$emit通过范围层次结构调度向上事件。你的指令是兄弟姐妹,因此$emit将不起作用。

解决方案可能是$broadcast来自父作用域的事件。如果这是您的选项,请从ctrl执行此操作,或者将$rootScope注入指令并从那里执行$rootScope.$broadcast

$rootScope.$brodcast("UPDATE_PARENT","updated");

请注意来自$broadcasting的{​​{1}}个事件似乎是AngularJS的反模式。它在很大程度上取决于用例。您的问题还有其他解决方案:

  • 其中一个是为两个指令创建父指令。
  • 另一个是使用具有价值的中介$rootScope。然后,您可以对服务数据执行service并做出相应的反应。
  • 您可$watch将事件发送至$emit,然后将ctrl ctrl发送至另一指令。

选择最适合您需求的产品。

答案 1 :(得分:2)

我遇到了同样的问题。

现在传递了两个指令之间的事件,而不是范围。$ emit,而不是范围。$ broadcast。

环顾四周后,我做了这个伎俩, 使用范围。$ parent。$ with your parent scope:

指令1:

scope.$parent.$broadcast('NO_LIVE_CONNECTION', {});

指令2:

scope.$on('NO_LIVE_CONNECTION', function (event, params) {
  console.log("No live DB connections ...");
  scope.state.showErrorMessage = true;
});