angularjs – 角度JS – 在非依赖服务之间进行通信

前端之家收集整理的这篇文章主要介绍了angularjs – 角度JS – 在非依赖服务之间进行通信前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是新的有角度,遇到一个catch-22:

事实:

>我有一个服务记录我的东西(我的记录器).
>我已经替换了$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),这是不可能的,如上所述.

我的问题:

有没有一个有角度的方式让两个服务通过第三方实体进行通信?

任何想法如何解决

使用作为通知/ pubsub服务的第三个服务:
.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如有兴趣).

猜你在找的Angularjs相关文章