我又遇到了自己无法正确回答的问题,这可能是因为我缺乏对EmberJS的了解。

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

例如:

也许我会触发一个 Controller 方法,该方法将发送如下的websocket消息:
{command: "say", parameters: {message: "Hello guys!"} }
此命令与实体(DS)不相关,并且永远不会进入应用程序存储。

另一个例子是这样的:
{command: "load entity", parameters: {type: "Vendor\Bundle\Entity\Type", id: 43} }
它将加载应存储在应用程序商店中的实体。

嗯,就像我说的那样,我对EmberJS并不那么熟悉,因此我可以弄清楚哪种方法最好。我是否应该完全绕过DS适配器并在加载实体后检查“isDirty”以及仅检查push方法?我对您有任何想法感到高兴!

最佳答案

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

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

因此,例如,如果您的服务器通过如下所示的websocket向您发送JSON,

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

您可以将数据推送到您的商店中。例如,以下代码片段可用于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);
    });
  }
});

您可以轻松修改此代码段以适合您的需求。

关于ember.js - EmberJS和WebSocket最佳方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22459010/

10-11 15:28