【问题标题】:EmberJS and WebSocket | Best Approach?EmberJS 和 WebSocket |最佳方法?
【发布时间】:2014-04-06 01:24:27
【问题描述】:

我又一次无法正确回答自己的问题,可能是因为我对 EmberJS 缺乏经验。

我必须在 EmberJS 中开发一个管理界面,使用 Symfony 2 作为后端,它的行为和感觉应该像一个桌面应用程序。到目前为止一切都很好,但是由于很多人将使用此应用程序中的数据,我真的很想为 EmberJS 使用 WebSocket 适配器实现,因为每个连接的客户端都应该立即(或尽快)知道实体的变化。我可以为 EmberJS 编写一个 WebSocket 适配器,但我的问题是 WebSocket 将比 RESTful 操作做更多的事情,服务器也将在没有任何 EmberJS 请求的情况下发送消息(例如,实体已更改,服务器将此更改广播给所有客户端)。这意味着我需要一个基于 RESTful 操作的“命令”结构,就我的经验而言,它不适用于纯 DS 适配器。

例如:

也许我会触发一个控制器方法来发送这样的 websocket 消息:

{command: "say", parameters: {message: "Hello guys!"} }

此命令与实体 (DS) 无关,永远不会进入应用商店。

另一个例子是这样的:

{command: "load entity", parameters: {type: "Vendor\Bundle\Entity\Type", id: 43} }

这将加载应该存储在应用商店中的实体。

好吧,正如我所说,我对 EmberJS 不是很熟悉,所以我可以弄清楚哪种方法可能是最好的。我应该完全绕过 DS 适配器并在加载实体后检查“isDirty”和推送方法吗?我很高兴你有任何想法!

【问题讨论】:

    标签: ember.js websocket


    【解决方案1】:

    据我了解您的问题,您想将更改从后端推送到单页应用程序吗?

    您可以使用 self.store.push('modelName', json) 将自定义 JSON 推送到您在 Ember 中的应用程序存储中。看看docs 以获得更好的理解。

    例如,如果您的服务器通过 websocket 向您发送 JSON,看起来像这样

    { 
      - "message": {
        "type": "fooModel", 
        "data": {
          ... // Model attributes here 
        }
      }
    }
    

    您可以将数据推送到您的商店。例如,以下 sn-p 将与 SocketIO 一起使用:

    App.ApplicationRoute = Ember.Route.extend({                                                              
      activate: function() {                
        // connect to the websocket once we enter the application route                                                                   
        var socket = window.io.connect('http://localhost:8080');                                                           
    
        var self = this;                                                                                                   
    
        socket.on('message', function(data){                                                                               
          self.store.push(data.type, data.item);                                                                              
        });                                                                                                                
      }
    });  
    

    您可以轻松修改此 sn-p 以满足您的需要。

    【讨论】:

    • 这很简单!感谢sn-p,我想这将是正确的方向。但要明确一点,这个解决方案会绕过 EmberJS 的 DS 的 RESTful api(保存、查找、加载),对吧?
    • 我认为你在这里混淆了不同的东西。 RESTful 意味着您通过 XHR 从服务器加载数据。将数据从服务器推送到客户端并不能替代 RESTful API。还需要通过 XHR 查询数据,因为您需要在应用启动时填充数据存储。这只是“实时”更新的附加组件。
    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 2020-02-19
    相关资源
    最近更新 更多