我还有一个我无法正确回答的问题,可能是因为我对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"只是加载实体后的推送方法?我对你的想法感到高兴!
答案 0 :(得分:8)
据我了解您的问题,您希望将更改从后端推送到单页应用程序?
您可以使用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);
});
}
});
您可以轻松修改此代码段以满足您的需求。