首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角度服务解耦

角度服务解耦
EN

Stack Overflow用户
提问于 2012-12-18 06:16:56
回答 1查看 499关注 0票数 1

我在玩angularjs做一些简单的事情。我想加入一些实时消息,如PubNub,PubSub或Pusher。基本上,我已经让它工作了,但在某些方面似乎太麻烦了。也许你能告诉我一条更好的路。

好的,这是我的jsfiddle (使用pubsub伪造的) http://jsfiddle.net/canree/dD5VR/

我有外部服务(pubsub),并为它创建了角度服务。现在,由于我不希望我的应用程序的其他部分依赖于这个具体的实现,我决定创建另一个(inbox)来存储pubsub发送的所有消息。这个inbox将是我的应用程序中的依赖项(而不是pubsub)。

所以我希望我的依赖项是:

代码语言:javascript
复制
controller -> inbox -> pubsub

pubsub收到一条消息时,它需要将其添加到inbox中,以便控制器可以看到该消息并做出相应的反应。问题是我不想要这种向后依赖(pubsub -> inbox)。我希望pubsub通知观察者消息已收到。

我现在拥有的是丑陋的回调注册(收件箱在pubsub中注册回调)。我不太喜欢它,因为它有很多样板(关于this处理等)。

我想知道是否有其他方法来连接这些服务?事件(但不会被迫在任何地方使用$rootScope )?如果是这样,在哪里注册这样的事件处理程序?服务可以接收事件吗?

请看一下提供的小提琴,并建议我如何更好地解决它。

EN

回答 1

Stack Overflow用户

发布于 2012-12-18 10:29:03

我不希望我的应用程序的其他部分依赖于这个具体实现

与服务器的交互已经在pubsub服务中进行了包装/抽象。如果与服务器的交互需要更改,它已经隔离到该服务。我认为添加另一层抽象层并不足以抵消您需要编写的额外代码(正如您已经看到的)。

以下是关于如何简化代码的其他一些观察(其中一些您可能已经知道,但它可能对其他人有指导意义):

  1. ()函数不是必需的(特别是因为消息不是私有数据)。在Angular中,控制器$scope/模型通常直接绑定到服务模型,因此您可以简单地使用:$scope.messages = inbox.messages;

(如果您喜欢content()函数,可以考虑将收件箱中的消息设为私有service.)

  • There不需要向收件箱控制器发送有关收件箱消息数组更改的事件。append()函数只需要调用$rootScope.$digest()。实际上,这可能不是必需的,因为真正的服务可能使用$http或$resource,这将自动调用$apply()或$digest。因此,不需要_broadcastNewMessage(),也不需要控制器中的$scope.$on()。

即使您保留content()函数不变,您仍然不需要广播inbox依赖于anything.

  • Since,我会让收件箱服务注册自己pubsub.subscribe(this.append, this);

  • pubsub's init()方法可以是内联的(不需要函数)

结合了上述所有观察结果的Fiddle

我想知道是否有其他方法来连接这些服务?

我只能考虑模型共享(例如,在service1: this.service1_obj_or_obj_property =service2.service2_obj_or_obj_property中),并在其他服务可以调用的依赖服务上创建函数。

服务可以接收事件吗?

由于$on和$broadcast是在作用域上定义的,而且服务是单例的,不受作用域的影响,因此我非常确定答案是“不”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13923162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档