我有一个返回id, name, properties
的端点,属性是一个该死的字符串,用逗号分隔的属性键/值对。是的,你没看错。
properties = "id:1,name:foobar,phone:123456789,taco:true"
当前模型
import DS from 'ember-data';
export default DS.Model.extend({
contact: DS.belongsTo("contact"),
name: DS.attr(),
phone: DS.attr(),
properties: DS.attr(),
eachProperties: function () {
return this.get('properties').split(",").map(function(propertyKeyValuePair) {
return propertyKeyValuePair.split(":");
});
}.property('properties')
});
properties
需要一些计算才能对前端有所帮助。
您可以重新使用名为properties
的属性,而不是创建一个名为eachProperties
的新属性吗?
类似的东西:
export default DS.Model.extend({
// ... other stuff
properties: DS.attr(function(model, obj){
return obj.split(",").map(function(propertyKeyValuePair) {
return propertyKeyValuePair.split(":");
});
});
});
或者如何将api属性名称的名称更改为rawProperties
之类的其他名称,然后将计算属性称为properties
?
我知道你正在思考"只是修复你该死的API" ,但你知道并不总是可能:)
答案 0 :(得分:0)
经过一些研究,我发现我基本上想利用Transforms (docs)来处理反序列化。它非常容易和rad。
根据Ember-CLI module-directory-naming-structure,您可以在app/transforms/
文件夹中添加转换。
我创建了一个名为properties.js
的文件。 (无论你命名什么文件都将是属性/转换的名称。)
//*inside app/transforms/properties.js*
import DS from 'ember-data';
export default DS.Transform.extend({
deserialize: function (serialized) {
return serialized.split(",").map(function (keyValuePair) {
return keyValuePair.split(":");
});
},
serialize: function (deserialized) {
return deserialized.map(function (keyValuePair) {
return keyValuePair.join(":");
}).join(",");
}
});
当您收到json时,以及当您发送JSON时,将使用此转换!超酷。
更新型号:
import DS from 'ember-data';
export default DS.Model.extend({
contact: DS.belongsTo("contact"),
name: DS.attr('string'),
phone: DS.attr(),
properties: DS.attr('properties')
});
DS.attr('properties')
是神奇发生的地方!