2012-12-17 81 views
1

我正在玩angularjs做一些简单的东西。我想要包含一些实时消息,如PubNub,PubSub或Pusher。 基本上我有它的工作,但它在一些地区似乎太麻烦。也许你可以给我一个更好的方法。角度服务解耦

好了,这是我工作的jsfiddle(与发布订阅伪造)http://jsfiddle.net/canree/dD5VR/

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

所以我想我的依赖关系为:

controller -> inbox -> pubsub 

pubsub接收就需要把它添加到inbox的消息,使控制器能看到它,并做出相应的反应。问题是我不希望这种后向依赖(pubsub -> inbox)。我想pubsub通知观察员已收到消息。

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

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

看看提供的小提琴,并建议我如何解决它更好的方式。

+0

“我不希望我的应用程序的其他部分依赖于此具体实现”,然后在不同模块中声明服务。 – mpm

回答

2

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

与服务器的交互已经包裹/在发布订阅服务抽象。如果与服务器的交互需要改变,它已经与该服务隔离了。我不认为增加另一个抽象层就足以抵消你需要编写的额外代码(正如你已经看到的)。

这里是你如何可以简化你的代码的一些其他意见(一些这方面你可能已经知道,但它可能对他人有启发):

  1. 内容()函数是不必要的(特别是因为消息不是私人数据)。在角控制器$范围/模型通常直接关系到一个服务模式,让你可以简单地使用:(如果你喜欢的内容()函数,考虑在收件箱服务让私人信息) $scope.messages = inbox.messages;

  2. 无需向收件箱控制器发送关于收件箱邮件数组更改的事件。 append()函数只需要调用$ rootScope。$ digest()。实际上,这可能不是必需的,因为真正的服务可能会使用$ http或$ resource,这会自动调用$ apply()或$ digest。所以不需要_broadcastNewMessage(),控制器中的$ scope($ on()也不需要。
    即使您保留content()函数,您仍然不需要广播任何内容。

  3. 由于收件箱中是依赖于发布订阅,我将有收件箱服务注册本身 pubsub.subscribe(this.append, this);

  4. 发布订阅的init()方法可以是在线(不需要功能)

Fiddle将所有上述观察结合起来。

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

我只能想到的模型共享(例如,在服务1:this.service1_obj_or_obj_property = service2.service2_obj_or_obj_property)和创建对因服务,其它服务可调用函数。

服务可以接收事件吗?

由于$ on和$ broadcast是在Scope上定义的,由于服务是单例,并且不受范围的影响,所以我很确定答案是“否”。

+0

非常感谢您的输入!但有一个问题,在你的答案的第3点中有'pubsub.subscribe(this.append,this)',这个'subscribe'的实现是我想避免的,因为这样做有'call'和' this'。此外,我觉得重新发明已经存在于Angular中的车轮。我的意思是我想使用现有的基础设施(如果事件不是这样的话,也许是事件以外的事情),而不是建立自己的观察/通知事情。我只是一个初学者,所以我可能不知道是否有更适合的东西。也许我这样做的方式也没关系。 – grafthez

+0

另请参阅http://stackoverflow.com/a/12015856/215945,其中描述了一种类似于pubsub/event bus的服务。 –