事实:
>我有一个服务记录我的东西(我的记录器).
>我已经替换了$ExceptionHandler(有角度),我自己的实现将未捕获的异常转发给我的logger服务
>我有另一个服务,推送服务,需要在使用’my-logger’在我的应用程序中记录一个致命的消息时被通知.
问题:
我不能让“我的记录器”依赖于“推送者”,因为它将创建循环依赖(“推送者”使用$http.圆圈:$ExceptionHandler – > my-logger – > push – > $http – > $ExceptionHandler …)
我的尝试:
为了使这两个服务相互通信,我想使用$watch on the pusher-service:在$rootscope上观察将在my-logger中更新的属性.
但是,当尝试在“my-logger”中使用$rootScope时,为了更新“pusher”“看”的属性,我无法执行循环依赖,因为$rootscope取决于$ExceptionHandler(圆圈:$ExceptionHandler – > my-logger – > $rootScope – > $ExceptionHandler).
试图找到在运行时获取在其上下文“my-logger”服务中的范围对象的选项.找不到这样的选择.
也不能使用广播,因为它需要我的记录器来访问范围($rootScope),这是不可能的,如上所述.
我的问题:
有没有一个有角度的方式让两个服务通过第三方实体进行通信?
任何想法如何解决?
.factory('NotificationService',[function() { var event1ServiceHandlers = []; return { // publish event1Happened: function(some_data) { angular.forEach(event1ServiceHandlers,function(handler) { handler(some_data); }); },// subscribe onEvent1: function(handler) { event1ServiceHandlers.push(handler); } }; }])
以上,我只显示一个事件/消息类型.每个附加事件/消息将需要自己的数组,发布方法和订阅方法.
.factory('Service1',['NotificationService',function(NotificationService) { // event1 handler var event1Happened = function(some_data) { console.log('S1',some_data); // do something here } // subscribe to event1 NotificationService.onEvent1(event1Happened); return { someMethod: function() { ... // publish event1 NotificationService.event1Happened(my_data); },}; }])
Service2的编码方式与Service1类似.
请注意,如果这种方法不使用$rootScope,$broadcast和Scopes,因为它们不需要与服务间通信.
通过上述实现,服务(一旦创建)在应用程序的使用期间保持订阅.您可以添加处理取消订阅的方法.
在我目前的项目中,我使用相同的NotificationService来处理控制器范围的pubsub. (见Updating “time ago” values in Angularjs and Momentjs如有兴趣).