对于使用JSONAPISerializer作为其序列化程序推送该模型的记录的模型
到存储区中的操作是通过store.push(dataInJSONAPISerializerFormat)完成的
https://www.emberjs.com/api/ember-data/3.3/classes/DS.Store/methods/push?anchor=push
但是,对于使用RESTSerializer作为其序列化程序的模型,则会为该方法推送记录
通过**store.pushPayload(“模型名称”,数据在REST序列化器格式中)将模型添加到存储中
https://www.emberjs.com/api/ember-data/3.3/classes/DS.Store/methods/pushPayload?anchor=pushPayload方法中的任何一个。
但是在JSON序列化器的情况下,它们都不工作?**有人能帮助我吗?
2条答案
按热度按时间7cjasjjr1#
您误解了DS.Store的
push
和pushPayload
方法之间的区别。push
method“用于通知Ember Data的存储中存在的新记录或更新的记录"。 它需要一个 *“规范化的JSON API文档”。规范化意味着它不仅必须符合JSON API specification,而且还必须遵循一些更严格的约定。如果你的payload还不是一个 * 规范化的JSON API文档 *,你必须将它转换成一些。这通常是由一个Serializer完成的。如果这个Serializer是DS.JSONSerializer的扩展,DS.RestSerializer或DS.Serializer基类。即使您使用的是DS.JSONAPISerializer,如果它没有规范化,也可能需要序列化负载(例如
type
不是复数)。pushPayload
method“是store#push的一个方便的 Package 器,它将对payloads” 进行序列化。所以这只不过是对提供的数据应用一个序列化器,并将规范化的数据推送到store中。序列化程序必须通过实现
pushPayload()
方法来支持store.pushPayload()
。并非Ember Data附带的所有序列化程序都支持它。DS.JSONSerializer
不支持。您可以实现它,或者直接调用normalizeResponse()
并将规范化响应传递给store.push()
。实现pushPayload
可能困难也可能不难,具体取决于您的具体API实现和你想要支持的用例,因为你必须知道主模型的类和请求类型。根据你的API,这些信息可能在你的负载中可用,也可能不可用。请注意,目前正在讨论弃用
pushPayload
:https://github.com/emberjs/rfcs/issues/357。这可能是另一个不为DS.JSONSerializer实现自定义解决方案而使用serializer.normalizeResponse()
和store.push()
的理由。rkkpypqq2#
好吧,这个问题是五年前的,但我遇到了同样的问题,经过长时间的搜索发现,以下是在2015.4工作:
在serializers/application.js中:
字符串
然后我调用(这里给出了dummy-payload和model_name):
型
我从这里采取的方法https://github.com/emberjs/data/issues/4181#issuecomment-193236439将给予更多的信息,如果你想采用这种解决方案。