对于使用JSONAPISerializer作为序列化程序的模型,为该模型推送记录
进入商店是由store.push(dataInJSONAPISerializerFormat)完成的
https://www.emberjs.com/api/ember-data/3.3/classes/DS.Store/methods/push?anchor=push
用于使用RESTSerializer作为序列化程序的模型的method.But,该序列化程序推动该模型的记录
进入商店的模型由store.pushPayload("modelName",dataInRESTSerializerFormat)完成
https://www.emberjs.com/api/ember-data/3.3/classes/DS.Store/methods/pushPayload?anchor=pushPayload法
但是如果是JSONSerializer,他们两个都不起作用了?有人能帮我吗?
发布于 2018-08-31 10:13:23
您误解了push
和DS.Store的pushPayload
方法之间的区别。
方法“用于通知Ember数据存储后端中存在的新记录或更新记录。它需要一个“规范化的JSON文档”。规范化意味着它不仅必须符合JSON API规范,而且还要遵循一些更严格的约定。
如果负载还不是规范化的JSON文档,则必须将其转换为一些文档。这通常是由序列化程序完成的。如果这个序列化程序是由DS.JSONSerializer、DS.RestSerializer或者仅仅是基类DS.Serializer类扩展的,这并不重要。即使您使用的是DS.JSONAPISerializer,如果负载没有标准化,您可能需要序列化它(例如,type
不是复数的)。
方法“是用于反序列化有效负载的store#push的方便包装器”。因此,这只不过是对所提供的数据应用序列化程序,并将规范化数据推入存储区。
序列化程序必须通过实现store.pushPayload()
方法来支持pushPayload()
。并非所有随Ember数据提供的序列化程序都支持它。DS.JSONSerializer
没有。您可以实现它,也可以直接调用normalizeResponse()
并将规范化的响应传递给store.push()
。实现pushPayload
可能是困难的,也可能不是困难的,这取决于具体的API实现和您想要支持的用例,因为您必须知道主模型的类和请求类型。根据您的API,这些信息可能在有效负载中可用,也可能不可用。
请注意,正在进行中的讨论反对pushPayload
:https://github.com/emberjs/rfcs/issues/357。这可能是另一个不为您的DS.JSONSerializer实现自定义解决方案而是使用serializer.normalizeResponse()
和store.push()
的参数。
https://stackoverflow.com/questions/52110251
复制相似问题