动态定义 Ember 数据模型的属性



我正在研究一个数据模型,该模型具有一组始终存在的预定义属性,以及用户为其定义的其他自定义属性。

一家公司有很多角色。使用此系统的每家公司都希望为其所有角色定义自定义属性,以及所有角色在不同公司中具有的固定属性集。

这个想法是,json-api 中的角色有效负载具有所有属性,无论是否自定义:

{
"id": "123",
"type": "roles",
"attributes": {
"name": "CEO",
"salary": 100000,
"favoriteColor": "blue"
}
}

在上述角色中,namesalary是默认属性,存在于所有角色中,无论公司如何,但favoriteColor是一个自定义属性,拥有此角色的特定公司将其定义为他们需要为其所有角色拥有的属性。

我想知道我是否可以使用 Ember Data 摆脱这样的事情,因为我将无法在角色模型定义中定义这些自定义属性:

// app/models/role.js
export default DS.Model.extend({
name: DS.attr('string'),
salary: DS.attr('number'),
})

更糟糕的是,这个想法是这些自定义属性不一定是字符串值,但它们也可以指定其类型。因此,公司可能希望拥有stringfavoriteColor,以及datebirthDate

我会添加一个属性(您的服务器需要在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')
})

使用可自定义的 jsona 数据格式化程序,它可能对自动创建 ember 数据模型非常有帮助。此外,也可以从余烬数据模型中自动创建正确的 JSON,:)

最新更新