我有一个大的复杂AngularJS Comet application(“实时”)。客户端将数据发送到服务器,并从服务器接收有关其他用户发起的事件的通知。AngularJS Comet(“实时”)应用程序双向模块间通信
在其最简单的形式中,应用程序有这些客户端组件(“服务”下方可以是AngularJS。服务或.factory,不管)
[Object] Controller
:可以是任何对象,如Student
,Teacher
,Lesson
,Document
[Object] Service
:保持所述对象的模型,并具有的方法来对数据进行操作Socket Service
:包装器套接字库
呼叫可以走两个方向
- 用户更新的东西>
[Object] Controller
>[Object] Service
>Socket Service
>服务器 - 服务器>
Socket Service
>[Object] Service
>[Object] Controller
>通知用户
什么是最好的在这种情况下双向模块间通信的架构?
以下是我认为的选项。如果我把它们排除在外,请提出其他好的建议。
- 使用circular dependency fudge。我看到的所有地方似乎都不应该这样做,包括Lu4在他的“软弱”答案中。另一方面,这样做意味着您可以在两个方向上进行方法调用,从而在整个应用程序中保持模块间通信的一致性。
- 在一个方向使用依赖注入和方法调用,而在另一个方向使用方向调用。有someopposition过度使用事件。这是一个过度使用的情况吗?
- 在两个方向使用事件。更接近“过度使用”,但在整个应用程序中保持模块间通信的一致性。
- 使用Mediator pattern,即有一个中央协调服务,在两个方向上进行协调。我不确定这与使用事件有什么不同或更好,其中$ rootScope成为注册所有事件及其回调的“中介”。
- 某种类型的模块之间的长轮询的,因此,如
[Object] Controller
使得以[Object] Service
调用,它返回一个承诺,依次调用Socket Service
也返回一个承诺,当Socket Service
接收的一些数据,承诺解决回上链,此时[Object] Controller
发起另一个请求。
“从服务器接收客户端应用程序中的任何事情的更新都是在事件的定义中定义的。但是用户事件也是如此,因此''(“#clickme”)。on(“click”,...'在jQuery等等。为什么在整个事件中使用事件并不是“干净”的?这很简单。 – poshest 2014-10-07 08:43:25
我不会实际上,恕我直言,使用angular的主要原因之一是双向绑定,但它们必须使用控制器来设置,Angular仅使用' $ scope'作为粘合剂,它确实没有提供任何类型的模型控制器,它可以用来将模型绑定到发出事件的数据源上,这很好,因为大多数web应用程序都是基于turn的('$ HTTP'-服务可以很好地隐藏“就绪”或“失败”事件,这些事件与随时可能发生的事件根本不同)。 – 2014-10-07 14:08:05
AngularJS没有提供“模型控制器,可用于将模型绑定到数据源”无论如何!我不打算放弃双向绑定,但是想象一下调用'$ scope.addNewT eacher“,而不是执行'$ http'的套接字版本,它返回promise和all,只是发出一个事件,如果新教师来自服务器,则可以由套接字服务发出的SAME事件。不需要编写依赖于完全不同技术的两个不同的addNewTeacher函数。 – poshest 2014-10-07 18:24:10