Angularjs 角度,模块间通信

Angularjs 角度,模块间通信,angularjs,events,broadcast,emit,Angularjs,Events,Broadcast,Emit,我已为我的项目设置了休耕: mainApp主角度模块,包含EventBus工厂 app1注入mainApp的第一个模块 app2第二个模块已注入mainApp app1和app2是放在同一页面上的两个模块,都注入了mainApp 我正在尝试使用EventBus工厂在app1和app2之间进行通信,这是在mainApp中定义的。 不幸的是,我无法让它工作(app1无法捕获app2事件,反之亦然) 我应该如何解决这个问题?我是否采取了错误的方法 EventBus.subscribe("App1C

我已为我的项目设置了休耕:

  • mainApp主角度模块,包含EventBus工厂
  • app1注入mainApp的第一个模块
  • app2第二个模块已注入mainApp
app1和app2是放在同一页面上的两个模块,都注入了mainApp

我正在尝试使用EventBus工厂在app1和app2之间进行通信,这是在mainApp中定义的。 不幸的是,我无法让它工作(app1无法捕获app2事件,反之亦然)

我应该如何解决这个问题?我是否采取了错误的方法

EventBus.subscribe("App1Ctr.event", function (event, data) {
    console.log("App2handler");
    $scope.name = data.newVal;
});


$scope.fireEvent = function () {
    EventBus.broadcast("App2Ctr.event", {"newVal": "App2Ctr"});
};

下面是一个

您需要更改注入依赖项的方式。您的
main.js
需要包含以下内容:

var mainApp = angular.module("mainApp", ["app1", "app2"])
您的两个
app1.js
app2.js
可以从
mainApp
中删除依赖项要求:

var app1 = angular.module("app1", [])

index.html
中的初始化代码变为

<script>
    angular.element(document).ready(function() {
        angular.bootstrap(document, ["mainApp"]);
    });
</script>

元素(文档).ready(函数(){
引导(文档,[“mainApp”]);
});

您还需要更改对
{{name}}
的引用,以便它们包含一个点(因为angular中的整个原型继承)。请参阅,有关
$broadcast
$emit
$on
$rootScope
的详细信息,我设法找到了解决方案。EventBus中的广播方法应类似于:

_broadcast = function(eventName, data) {
    console.log("EventBus broadcast: " + eventName);
    angular.element(document.getElementById('app1')).scope().$root.$emit(eventName, data);
  };

由于必须按ID获取angular应用程序,因此我将使用另外的EventDispatcher来处理此问题。

能否添加一些细节,例如:1)您的预期输出/行为是什么?2) 当前输出/行为是什么?@KhalidHussain预期输出:我有几个模块,希望所有模块都能侦听从一个主(注入)模块发送的事件。当前输出-app1和APP2中均未捕获任何事件。请在plnkr中添加一个
控制台。记录
,然后打印当前输出?更新了此plunker,看起来广播已正确启动,但订阅不起作用。只需再提供一点信息,指定当前输出错误的
控制台日志
,并说明您的预期输出。如果你把所有的信息都放到你的问题中会更好。不幸的是,我不能这样做,因为这会使项目结构朝上向下。你的
main.js
当前只包含
EventBus
的工厂,所以你不妨将其重命名为
EventBus.js
。另一种方法是使您的
app1
app2
子级成为公共父级,在子级上使用
$scope.$emit
,并让父级使用
$scope.$broadcast
在层次结构下重新广播事件,如示例中所示,它与不同的控制器一起工作,但是我如何嵌套angular应用程序/模块?我已经编辑过,向您展示了处理多模块angular应用程序的标准方法(将手动引导部分替换为
ng app
)。这正是你通常定义应用程序模块的方式,你将它们列为主模块的依赖项。Thnks,但正如我所说的,我不能这样做,该项目非常大,包含许多角度应用程序,我现在无法恢复所有项目的结构,因为它会破坏许多其他功能。无论如何,谢谢你。
_broadcast = function(eventName, data) {
    console.log("EventBus broadcast: " + eventName);
    angular.element(document.getElementById('app1')).scope().$root.$emit(eventName, data);
  };