Ember数据:使用序列化和使用虚线jsonapi属性的attrs哈希来简化post对象

问题描述 投票:1回答:1

这是一个简化的例子。请记住,实际模型是20个字段和一些计算属性。 '订单'模式

shippingFirstName: DS.attr('string'),
shippingLastName: DS.attr('string'),

模板(作为newOrder传入的模型)

<ul class="thing-list">
  <li class="thing first-name">
    <label class="field text" for="shippingFirstName">
      <div class="label">
        <span>First name</span>
      </div>
      {{input 
        id="shippingFirstName" 
        value=newOrder.shippingFirstName 
        placeholder="......."}}
    </label>
  </li>
...

发布数据

data: {
  attributes: {
    shipping-first-name: 'sheriff',
    shipping-last-name: 'derek',
  },
  type: 'orders',
}

期望的结果

{
  shipping_to: {
    first_name: 'sheriff',
    last_name: 'derek',
  },
}

'order'的序列化器(我希望工作......)

import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({

  serialize(snapshot, options) {
    let json = this._super(...arguments);
    json = json.data.attributes;

    console.log(json); // shows attributes as shipping-first-name

    json.shipping_to = {
      first_name: json.shippingFirstName,
      last_name: json.shippingLastName,
    };

    delete json.shippingFirstName;
    delete json.shippingLastName;

    return json;
  },

});

但shipping_to属性没有出现在帖子中,其他值都是破折号(JSON:API样式)

文档很棒:https://guides.emberjs.com/v2.18.0/models/customizing-serializers,但示例不是虚线键。

当我愚弄attrs hash时,我可以让事情发挥作用 - 但它似乎非常随意和/或我不明白发生了什么。

import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({

  serialize(snapshot, options) {
    let json = this._super(...arguments);
    json = json.data.attributes;

    console.log(json);

    json.shipping_to = {
      first_name: json.whatever_thing_not_dashed,
      last_name: json.whateverThingCamel,
    };

    delete json.whatever_thing_not_dashed;
    delete json.whateverThingCamel;

    return json;
  },

  attrs: {
    shippingFirstName: 'whatever_thing_not_dashed',
    shippingLastName: 'whateverThingCamel',
  },

});

我错过了什么? (后端的名称不够整齐,只能将骆驼变为全面的下划线 - 而且它们的嵌套方式不同)

ember.js ember-data json-api
1个回答
1
投票

首先,因为你的后端不期望JSONAPI对象你应该使用另一个序列化器,如JSONSerializer

https://guides.emberjs.com/v2.18.0/models/customizing-serializers/#toc_jsonserializer

这将删除键“数据”和“类型”,然后你可以使用你用来转换蛇盒中的attrs与Ember.String.underscore相同的钩子,并添加你想要的键

http://www.emberjs.com.cn/api/classes/Ember.String.html#method_underscore

您还应该为模型创建特定的序列化程序

ember g serializer <name of your model>

这样您只更改了您想要的特定模型,而不是整个应用程序

© www.soinside.com 2019 - 2024. All rights reserved.