【问题标题】:Ember data: simplify post object with serialize and attrs hash with dashed jsonapi attributesEmber 数据:使用序列化和带有虚线 jsonapi 属性的 attrs 哈希简化 post 对象
【发布时间】:2018-06-13 23:50:07
【问题描述】:

这是一个简化的例子。 请记住,实际模型是 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 哈希时,我可以让事情正常工作 - 但它似乎非常武断和/或我不明白发生了什么。

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',
  },

});

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

【问题讨论】:

  • 当您直接与json.data.attributes合作时,我会尝试测试它是否有效

标签: ember.js ember-data json-api


【解决方案1】:

首先,由于您的后端不期望 JSONAPI 对象,您应该使用另一个序列化器,例如 JSONSerializer

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

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

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

你还应该为你的模型创建一个特定的序列化器

ember g serializer &lt;name of your model&gt;

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

【讨论】:

  • 谢谢,马塞尔。我以前用过它们中的每一个——但我想我没有想清楚! JSONSerializer 运行良好。在这种情况下,我真的不能使用下划线方法。 shippingStreetAddress ≠ shipping_to.address_line_1。而且我的序列化程序已经用于“订单”。
  • 如果您想尝试解释我上面示例中发生的事情 - 那也很棒。
  • 我很困惑...所以您使用 JSONapi 序列化程序而不是 JSON 序列化程序吗?
  • 乐于助人 :),您忘记了对象格式,json api 对象具有特定格式,我在这里更改了您的示例:ember-twiddle.com/... 但不要这样做,请改用 JSONSerializer,这样您就不需要删除任何键。 obj:这只是一个错字,我不得不重新发布它
  • 链接:ember-twiddle.com/7062d70d2eba3ba32a8f448cd50b2b2d,ember twiddle 是测试这种东西的好地方,我希望我知道如何更好地在 chrome 上格式化 alertbox json 消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
相关资源
最近更新 更多