如何在多个Angular模块中控制$ rootScope?

时间:2015-02-06 01:08:09

标签: angularjs

我有一个大型的AngularJS应用程序,我通过将不同的关键功能分离到自己的模块中来组织。例如,我有2个名为" myApp.Alerts"和" myApp.Header"。

" myApp.Alerts"包含一个工厂,一些指令和一个控制器,用于管理"警报"我的应用中的页面。

" myApp.Header"也是一个包含指令和控制器的模块,用于管理我的应用程序的标题。

现在在我的标题中我希望有一些与警报相关的功能(基本上是推送通知,如facebook或twitter),所以如果用户在页面上更改了某些内容,那么它也将在标题中更新。

我的" myApp.Header"使用DI来获得" myApp.Alerts"与

angular.module('myApp.Header', ['myApp.Alerts'])

我在" myApp.Alerts"中使用工厂。获取,发布,删除,删除警报。当其中一个操作完成后,例如DELETE警报,我试图使用事件来触发" myApp.Header"也要更新。

因此,如果调用了MyAlertsFactory.deleteAlert(alert),那么我会执行类似$rootScope.$broadcast('updateAlert:delete')的操作,然后在我的标题中,我有一个$scope.$on('updateAlert:delete')的指令。

问题是我的听众从未处理过该事件。经过一些调试后,我意识到我的2个模块每个都实例化了我工厂的不同版本。不是在应用程序的整个生命周期内共享的单身人士,而是有两个不同的单身人士......一个是带有" myApp.Header"和另一个" myApp.Alerts"。这会导致事件永远不会触发正确的服务。

是否有正确的方式来链接"一起模块,所以他们共享相同的$ rootScope和其他factorys,服务,提供商等?

1 个答案:

答案 0 :(得分:0)

这不是你应该做的一般事情,最好考虑为什么你有单独的模块需要以这种方式相互通信。

虽然这是解决方案的草图:

有一个存储每个模块rootScope的窗口元素,并在app.run块中更新。

编写一个包装器,用于在想要推送到其他模块的应用程序中触发rootScope上的事件。这个包装函数在每个rootScope上执行事件,并在每个rootScope上调用摘要。你不能忘记打电话给摘要。