Angular,模块之间的通信

时间:2016-05-10 07:54:32

标签: angularjs events broadcast emit

我已经完成了项目的设置:

  • mainApp主角度模块,包含EventBus工厂
  • app1第一个模块,注入了mainApp
  • app2第二个模块,注入了mainApp

app1和app2是放在同一页面上的两个模块,都注入了mainApp。

我正在尝试使用在mainApp中定义的EventBus工厂在app1和app2之间进行通信。 不幸的是,我无法让它工作(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"});
};

这是plnkr

2 个答案:

答案 0 :(得分:0)

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

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

您的两个app1.jsapp2.js可以从mainApp中删除相关性要求:

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

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

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

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

您还需要更改对{{name}}的引用,以便它们包含一个点(因为角度中的整个原型继承事物)。有关$broadcast$emit$on$rootScope的详细信息,请参阅this plunkrthis question

答案 1 :(得分:0)

我设法找到了解决方案。 EventBus中的广播方法应该类似于:

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

由于必须通过ID获取角度应用,我还将使用EventDispatcher来处理此问题。