Ember 数据:使用带有虚线 jsonapi 属性的序列化和 attrs 哈希简化 post 对象
Ember data: simplify post object with serialize and attrs hash with dashed jsonapi attributes
这是一个简化的例子。 请记住,实际模型是 20 个字段和一些计算属性。
'order' 型号
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>
...
post编辑数据
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 属性不会出现在 post 中,其他值采用破折号形式(JSON:API 样式)
文档很棒:https://guides.emberjs.com/v2.18.0/models/customizing-serializers 但示例不是破折号。
当我胡乱使用 attrs 散列时,我可以让事情正常进行 - 但它似乎非常随意 and/or 我不明白发生了什么。
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',
},
});
我错过了什么? (后端的名称不够一致,无法将骆驼全部变成下划线 - 而且它们的嵌套方式不同)
首先,由于您的后端不需要 JSONAPI 对象,因此您应该使用另一个序列化程序,例如 JSONSerializer
https://guides.emberjs.com/v2.18.0/models/customizing-serializers/#toc_jsonserializer
这将删除密钥 "data" 和 "type",然后您可以使用与使用 Ember.String.underscore 转换蛇案例中的属性相同的钩子并添加密钥你想要的
http://www.emberjs.com.cn/api/classes/Ember.String.html#method_underscore
你还应该为你的模型创建一个特定的序列化程序
ember g serializer <name of your model>
这样你就可以只更改你想要的特定模型而不是整个应用程序
这是一个简化的例子。 请记住,实际模型是 20 个字段和一些计算属性。
'order' 型号
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>
...
post编辑数据
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 属性不会出现在 post 中,其他值采用破折号形式(JSON:API 样式)
文档很棒:https://guides.emberjs.com/v2.18.0/models/customizing-serializers 但示例不是破折号。
当我胡乱使用 attrs 散列时,我可以让事情正常进行 - 但它似乎非常随意 and/or 我不明白发生了什么。
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',
},
});
我错过了什么? (后端的名称不够一致,无法将骆驼全部变成下划线 - 而且它们的嵌套方式不同)
首先,由于您的后端不需要 JSONAPI 对象,因此您应该使用另一个序列化程序,例如 JSONSerializer
https://guides.emberjs.com/v2.18.0/models/customizing-serializers/#toc_jsonserializer
这将删除密钥 "data" 和 "type",然后您可以使用与使用 Ember.String.underscore 转换蛇案例中的属性相同的钩子并添加密钥你想要的
http://www.emberjs.com.cn/api/classes/Ember.String.html#method_underscore
你还应该为你的模型创建一个特定的序列化程序
ember g serializer <name of your model>
这样你就可以只更改你想要的特定模型而不是整个应用程序