动态定义Ember Data模型的属性

时间:2017-03-27 13:29:02

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

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

公司有很多角色。除了所有角色在不同公司中拥有的固定属性集之外,使用此系统的每家公司都希望为其所有角色定义自定义属性。

这个想法是,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'),
})

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

2 个答案:

答案 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:)

相关问题