如何在Ember js中将数据推送到具有JSONSerializer的模型的存储中,因为它的Serializer不是JSONAPISerializer或RESTSerializer?

pkwftd7m  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(172)

对于使用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序列化器的情况下,它们都不工作?**有人能帮助我吗?

7cjasjjr

7cjasjjr1#

您误解了DS.Store的pushpushPayload方法之间的区别。
push method“用于通知Ember Data的存储中存在的新记录或更新的记录"。 它需要一个 *“规范化的JSON API文档”。规范化意味着它不仅必须符合JSON API specification,而且还必须遵循一些更严格的约定。
如果你的payload还不是一个 * 规范化的JSON API文档 *,你必须将它转换成一些。这通常是由一个Serializer完成的。如果这个Serializer是DS.JSONSerializer的扩展,DS.RestSerializerDS.Serializer基类。即使您使用的是DS.JSONAPISerializer,如果它没有规范化,也可能需要序列化负载(例如type不是复数)。
pushPayload method“是store#push的一个方便的 Package 器,它将对payloads” 进行序列化。所以这只不过是对提供的数据应用一个序列化器,并将规范化的数据推送到store中。
序列化程序必须通过实现pushPayload()方法来支持store.pushPayload()。并非Ember Data附带的所有序列化程序都支持它。DS.JSONSerializer不支持。您可以实现它,或者直接调用normalizeResponse()并将规范化响应传递给store.push()。实现pushPayload可能困难也可能不难,具体取决于您的具体API实现和你想要支持的用例,因为你必须知道主模型的类和请求类型。根据你的API,这些信息可能在你的负载中可用,也可能不可用。
请注意,目前正在讨论弃用pushPayloadhttps://github.com/emberjs/rfcs/issues/357。这可能是另一个不为DS.JSONSerializer实现自定义解决方案而使用serializer.normalizeResponse()store.push()的理由。

rkkpypqq

rkkpypqq2#

好吧,这个问题是五年前的,但我遇到了同样的问题,经过长时间的搜索发现,以下是在2015.4工作:
在serializers/application.js中:

import JSONSerializer from '@ember-data/serializer/json';

export default class ApplicationSerializer extends JSONSerializer {
    pushPayload (store, payload) {
        let serializer = this
        let normalized_payload = serializer.normalizeResponse (
            store,
            store.modelFor (payload.model_name),
            payload.data,
            null,
            'updateRecord', // this works for new records and existing ones
            1 // for excatly one record
        )

        store.push (normalized_payload) // push payload to store
    }

}

字符串
然后我调用(这里给出了dummy-payload和model_name):

let payload = {"id": 123, "name": "testname", "other_fields_name": "otherfields_content"}
this.store.pushPayload ({model_name: 'my_model_name', data: payload})


我从这里采取的方法https://github.com/emberjs/data/issues/4181#issuecomment-193236439将给予更多的信息,如果你想采用这种解决方案。

相关问题