Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角服务解耦_Javascript_Angularjs - Fatal编程技术网

Javascript 角服务解耦

Javascript 角服务解耦,javascript,angularjs,Javascript,Angularjs,我在和angularjs玩一些简单的游戏。我想合并一些实时消息,比如PubNub、PubSub或Pusher。 基本上我有它的工作,但它似乎太麻烦在某些领域。也许你能给我一个更好的方法 好的,这是我的工作JSFIDLE(使用伪造的pubsub) 我有外部服务(pubsub),并为其创建了角度服务。 现在,由于我不希望我的应用程序的其他部分依赖于这个具体的实现,我决定创建另一个(inbox)来存储发送的所有消息pubsub)。这个收件箱将是我整个应用程序的依赖项(而不是pubsub) 因此,我希望

我在和angularjs玩一些简单的游戏。我想合并一些实时消息,比如PubNub、PubSub或Pusher。 基本上我有它的工作,但它似乎太麻烦在某些领域。也许你能给我一个更好的方法

好的,这是我的工作JSFIDLE(使用伪造的pubsub)

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

因此,我希望我的依赖关系是:

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

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

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

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


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

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

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

  • content()函数不是必需的(特别是因为消息不是私有数据)。在Angular中,controller$scope/model通常直接绑定到服务模型,因此您可以简单地使用:
    $scope.messages=inbox.messages
    (如果您喜欢CtTeNo.()函数,请考虑在收件箱服务中私密消息)

  • 无需向收件箱控制器发送有关收件箱消息数组更改的事件。append()函数只需要调用$rootScope.$digest()。实际上,这可能不需要,因为真正的服务可能会使用$http或$resource,这将自动调用$apply()或$digest。因此不需要_broadcastNewMessage(),控制器中的$scope.$on()也不需要。
    即使保持content()函数不变,也不需要广播任何内容

  • 因为inbox依赖于pubsub,所以我会让inbox服务自行注册
    pubsub.subscribe(this.append,this)

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

  • 结合上述所有观察结果

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

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

    服务可以接收事件吗


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

    非常感谢您的输入!不过有一个问题,在你回答的第3点中有一个
    pubsub.subscribe(this.append,this)
    ,我想避免实现这个
    subscribe
    ,因为这会影响
    call
    this
    的技巧。我还想重新发明已经出现在Angular中的轮子。我的意思是,我想使用现有的基础设施(可能是事件以外的东西,如果这里不可能的话),而不是构建自己的观察/通知东西。我只是一个初学者,所以我可能不知道是否有更合适的。也许我这样做也没问题。另请参阅其中描述的服务类似于pubsub/事件总线。“我不希望我的应用程序的其他部分依赖于此具体实现”,然后在不同的模块中声明服务。