Mar*_*ois 7 ember.js ember-data
在我的Ember应用程序中,我收到来自websocket的通知.当websocket收到一条消息(编码为JSON)时,我想将它推入商店.
到目前为止,这是我的代码:
console.log('About to normalize', data);
var normalizedData = this.store.normalize('message', data);
console.log('About to push', normalizedData);
this.store.push('message', normalizedData);
Run Code Online (Sandbox Code Playgroud)
data和normalizedData最终是完全相同的值,如下所示:
{"message":{"id":1,"chatroom":1,"player":1,"content":"A message"}}
Run Code Online (Sandbox Code Playgroud)
并调用push方法会引发此错误:
Error: Assertion Failed: Expected an object as `data` in a call to `push`/`update` for message ,
but was {"message":{"id":1,"chatroom":1,"player":1,"content":"31232132113"}}
Run Code Online (Sandbox Code Playgroud)
我不知道出了什么问题.当Ember从服务器获取特定消息时,它会收到相同类型的JSON,而Ember Data会很好地处理它.当它来自websocket并且需要被推动时,它会崩溃.
更新
我尝试使用pushPayload,就像在评论中提出的那样.它仍然无法正常工作.我收到这些消息:
"警告:在有效负载中遇到"0",但未找到型号名称为"0"的模型(使用arkipel @ serializer解析的型号名称:-rest:.typeForRoot("0"))"
"警告:在有效负载中遇到"0",但未找到型号名称为"1"的模型(使用arkipel @ serializer解析的型号名称:-rest:.typeForRoot("1"))"
"警告:在有效负载中遇到"0",但未找到型号名称为"2"的模型(使用arkipel @ serializer解析的型号名称:-rest:.typeForRoot("2"))"
它上升到67,然后继续使用像fmt,camelize,htmlSafe这样的词......我只是数据只是一个表示JSON的字符串.
我们在聊天中做了一些调试后发现了问题.我会在这里为其他人分享解决方案.
websocket以字符串格式发送消息.所以data
在javascript代码中是一个字符串而不是javascript对象(JSON).Ember Data希望我们推送一个javascript对象而不是字符串.
解决方案是首先将来自websocket的响应解析为javascript对象,然后将其推入商店,例如通过执行JSON.parse(data)
.