1

我有一个大的复杂AngularJS Comet application(“实时”)。客户端将数据发送到服务器,并从服务器接收有关其他用户发起的事件的通知。AngularJS Comet(“实时”)应用程序双向模块间通信

在其最简单的形式中,应用程序有这些客户端组件(“服务”下方可以是AngularJS。服务或.factory,不管)

  • [Object] Controller:可以是任何对象,如StudentTeacherLessonDocument
  • [Object] Service:保持所述对象的模型,并具有的方法来对数据进行操作
  • Socket Service:包装器套接字库

呼叫可以走两个方向

  • 用户更新的东西>[Object] Controller>[Object] Service>Socket Service>服务器
  • 服务器>Socket Service>[Object] Service>[Object] Controller>通知用户

什么是最好的在这种情况下双向模块间通信的架构?

以下是我认为的选项。如果我把它们排除在外,请提出其他好的建议。

  1. 使用circular dependency fudge。我看到的所有地方似乎都不应该这样做,包括Lu4在他的“软弱”答案中。另一方面,这样做意味着您可以在两个方向上进行方法调用,从而在整个应用程序中保持模块间通信的一致性。
  2. 在一个方向使用依赖注入和方法调用,而在另一个方向使用方向调用。有someopposition过度使用事件。这是一个过度使用的情况吗?
  3. 在两个方向使用事件。更接近“过度使用”,但在整个应用程序中保持模块间通信的一致性。
  4. 使用Mediator pattern,即有一个中央协调服务,在两个方向上进行协调。我不确定这与使用事件有什么不同或更好,其中$ rootScope成为注册所有事件及其回调的“中介”。
  5. 某种类型的模块之间的长轮询的,因此,如[Object] Controller使得以[Object] Service调用,它返回一个承诺,依次调用Socket Service也返回一个承诺,当Socket Service接收的一些数据,承诺解决回上链,此时[Object] Controller发起另一个请求。

回答

1

干净的解决方案是将经典DI用于用户启动的方向。由于您的[对象]服务包含模型,您只需要更新该模型(如果您的实现是干净的,即您在任何地方都使用注入的模型对象)。

所以这个问题已经减少到如何从套接字服务获取新的更新到[Object]服务。由于你的套接字服务实际上不应该知道你的模型细节注入模型不是一个合理的解决方案(不要留下如此创建的循环依赖)。从服务器接收客户端应用程序中的任何更新的定义都是事件(随时可能发生),所以我认为在SocketService中获取$RootScope并将其广播是非常合理的。在此事件中,您的[对象]服务不需要根据新信息更新模型。

如果您有很多服务,并且通常服务器启动的事件只与其中一个或几个相关,则可能的优化是从服务器发送一个字段,这些字段受到此更新的影响。这是合理的,因为服务器已经知道模型,并且它使Socket服务能够在不知道xxx的含义的情况下广播updateFor:xxx事件。然后相应的[Object]服务仅侦听updateFor:[Object]事件。但是,一如既往的优化,如果简单的方法已经适用于您,请不要执行它们。

+0

“从服务器接收客户端应用程序中的任何事情的更新都是在事件的定义中定义的。但是用户事件也是如此,因此''(“#clickme”)。on(“click”,...'在jQuery等等。为什么在整个事件中使用事件并不是“干净”的?这很简单。 – poshest 2014-10-07 08:43:25

+0

我不会实际上,恕我直言,使用angular的主要原因之一是双向绑定,但它们必须使用控制器来设置,Angular仅使用' $ scope'作为粘合剂,它确实没有提供任何类型的模型控制器,它可以用来将模型绑定到发出事件的数据源上,这很好,因为大多数web应用程序都是基于turn的('$ HTTP'-服务可以很好地隐藏“就绪”或“失败”事件,这些事件与随时可能发生的事件根本不同)。 – 2014-10-07 14:08:05

+0

AngularJS没有提供“模型控制器,可用于将模型绑定到数据源”无论如何!我不打算放弃双向绑定,但是想象一下调用'$ scope.addNewT eacher“,而不是执行'$ http'的套接字版本,它返回promise和all,只是发出一个事件,如果新教师来自服务器,则可以由套接字服务发出的SAME事件。不需要编写依赖于完全不同技术的两个不同的addNewTeacher函数。 – poshest 2014-10-07 18:24:10