AngularJS:将REST与Socket.IO结合起来

时间:2014-03-29 17:18:41

标签: angularjs rest socket.io

在我最近构建的单页webapp中,我使用Restangular模块为我的模型获取数据。我想为应用添加实时更新,因此无论何时在服务器上更改或添加任何模型,我都可以更新我的模型列表。

我在Trello等网络应用程序中看到这种方法非常有效,您可以在不刷新网页的情况下查看更新。我确信Trello webclient使用REST API。

建立服务器和客户端以存档它的正确方法是什么?

1 个答案:

答案 0 :(得分:11)

首先,您的问题太笼统,可能有很多依赖的解决方案 根据您的需求和条件。

当您想要离开REST API时,我将简要介绍单个案例 并使用网络套接字添加一些实时

  1. 从REST获取所有数据 - Sokets仅用于通知。

    优点:易于实现服务器端和客户端。您只需要在服务器上发出事件 有关已修改资源(如资源名称和ID)的信息,并在客户端捕获这些事件并获取 使用REST API的数据。

    缺点:每次通知都会向服务器再发一次请求。当您为单个资源拥有大量活动客户端时,这会大大增加流量(它们会向服务器生成大量反向请求)。

  2. 从REST获取初始加载 - 套接字以获取包含数据有效负载的通知。

    优点:所有信息都附带通知,不会对服务器产生新请求,因此我们的流量较少。

    缺点:更难实现服务器端和客户端。您需要将数据添加到服务器上的所有事件。您需要从客户端的所有事件中获取数据。

    根据评论更新

    至于处理不同类型的模型(只是一种方法)。

    客户端。

    1. 为每个模型保留factory
    2. 请记住,您只需要显示数据的实时更新(在大多数情况下),因此您可以轻松实现 使用内存缓存(这样你就可以通过它的ID找到任何实体)。
    3. 为每种类型的更改添加侦听器(Created, Updated, Deleted)。
    4. 在任何监听器中你应该调用一些initObject函数,它将通过ID和extend在缓存中找到实体,如果没有具有这种ID的实体,只需创建一个新的并添加它要缓存。
    5. 任何Delete只会从缓存中删除实体。
    6. 任何时候你需要这个资源,你应该返回缓存对象的链接,以保持双向数据绑定(这就是我使用extend而不是=)的原因。当然,您需要处理以下情况:"用户正在编辑资源,而有关删除的通知来自"。

      服务器端。

      1. 发送所有模型然后只修改字段更容易(在这两种情况下,您都必须发送资源ID)。
      2. 针对所有参与用户的任何Create, Update, Delete事件推送活动。
      3. 事件名称应包含操作名称(如New,Update,Delete)和资源名称(如User,Task等)。因此,您将有NewTaskUpdateTask个事件。
      4. 事件有效负载应包含模型或仅包含ID的已修改字段。
      5. 可以通过两种方式处理集合更改:添加/更新/删除集合中的项目或更改整个集合。

        PUT, POST, DELETE等所有修改当然都是使用REST进行的。

        我为案例1)制作了一个超级简单的伪要点。 https://gist.github.com/gpstmp/9868760但可以针对案例2更新https://gist.github.com/gpstmp/9900454

        希望这有帮助。