EmberJS和WebSocket | 最佳方法?

Jea*_*ean 2 websocket ember.js

我有一个我无法正确回答的问题,也许是因为我缺乏与EmberJS的合作.

我必须在EmberJS中开发一个管理界面,使用Symfony 2作为后端,它应该像桌面应用程序一样运行.到目前为止一切都那么好,但由于很多人都会使用这个应用程序中的数据,我真的想使用EmberJS的WebSocket适配器实现,因为每个连接的客户端应该总是立即(或asap)知道实体的变化.我可以为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"以及加载实体后的推送方法?你对任何想法都感到高兴!

Flo*_*Flo 8

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

您可以使用将自定义JSON推送到Ember的应用程序商店中self.store.push('modelName', json).看一下更好的未完成的文档.

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

{ 
  - "message": {
    "type": "fooModel", 
    "data": {
      ... // Model attributes here 
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以将数据推送到你的商店.以下代码段可以与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);                                                                              
    });                                                                                                                
  }
});  
Run Code Online (Sandbox Code Playgroud)

您可以轻松修改此代码段以满足您的需求.