我正在开发一个数据模型,该模型具有一组始终存在的预定义属性,以及用户为其定义的其他自定义属性。
公司有很多角色。除了所有角色在不同公司中拥有的固定属性集之外,使用此系统的每家公司都希望为其所有角色定义自定义属性。
这个想法是,json-api中的角色有效载荷带有所有属性,自定义与否:
{
"id": "123",
"type": "roles",
"attributes": {
"name": "CEO",
"salary": 100000,
"favoriteColor": "blue"
}
}
在上述角色中,name
和salary
是默认属性,无论公司如何都存在于所有角色中,但favoriteColor
是一个自定义属性,具有此角色的特定公司定义为他们需要担任所有角色。
我想知道我是否可以使用Ember Data来解决这个问题,因为我无法在角色模型定义中定义这些自定义属性:
// app/models/role.js
export default DS.Model.extend({
name: DS.attr('string'),
salary: DS.attr('number'),
})
更糟糕的是,这个想法是这些自定义属性不一定是字符串值,但它们也可以指定其类型。因此,公司可能希望favoriteColor
类型为string
,birthDate
类型为date
。
答案 0 :(得分:1)
我会添加一个属性(您的服务器需要在config
属性中返回其他参数):
// app/models/role.js
export default DS.Model.extend({
name: DS.attr('string'),
salary: DS.attr('number'),
config: DS.attr() // accepts anything, including json
})
和
选项1:通过自定义序列化程序的normalize
函数处理属性的序列化,将config
中的值推送到序列化属性中。像这样:
// serializers/role.js
export default <Your Base Serializer>.extend({
normalize(typeClass, hash) {
const result = this._super(typeClass, hash);
result.data.attributes = Object.keys(data.attributes.config).reduce((acc, value) => {
acc[value] = result.data.attributes.config[value];
return acc
}, result.data.attributes);
return result;
},
});
选项2(如果您的选择有限):使用计算函数alias
:
// app/models/role.js
export default DS.Model.extend({
name: DS.attr('string'),
salary: DS.attr('number'),
config: DS.attr(), // accepts anything, including json
favoriteColor: Ember.computed.alias('config.favoriteColor')
})
答案 1 :(得分:0)
使用可自定义的jsona数据格式化程序,自动创建ember数据模型可能非常有用。此外,还可以自动从您的余烬数据模型中创建正确的JSON:)