定义复杂模型

时间:2013-06-24 14:35:10

标签: ember.js ember-data

我有以下user对象(json):

{
    "_id": "my-id",
    "org": 666,
    "type": "user",
    "properties": {
        "first_name": "Firstname",
        "surname1": "Surname1",
        "surname2": "Surname2",
        "allowed_apps": [ "one-app", "another-app" ],
        "default_app": "one-app",
        "email": "email@address.com"
    },
    "outputs": {
        "extension": "extension-id"
    }
}

这是一个单一的模型,具有复杂的结构。它不是“多模型结构”。因此,我想使用DS.Model.extend来定义此内容,但我想要belongsToproperties使用outputs关系,因为它们不要引用其他模型:这些字段只是复杂数据,直接属于我的user对象。也就是说,我们没有任何properties模型,也没有任何outputs模型。这些只是user模型的一部分,因此存储在数据库中(在我们的例子中是couchdb)。

这可以在ember中完成吗?

1 个答案:

答案 0 :(得分:4)

可悲的是,使用ember-data模型无法实现这种结构。 模型的每个值都不是原始模型,例如stringnumberboolean&如果不使用datebelongsTo进行设计,则无法将hasMany定义为模型属性。此外,仍然是WIP的网站jsonapi.org描述了ember-data的实施方向。

所以关键在于,如果你想/需要使用ember-data模型(DS.Model),你的服务器应该遵守ember-data期望的JSON格式,否则你总是有可能(因为ember-数据是后端不可知的)根本不使用ember-data模型定义,这样你的模型可以按你想要的方式构建,但是你不能从传统的工作ember-data适配器和序列化器中获得帮助为你做的,你必须编写自己的适配器,然后处理你的JSON所具有的所有特性,并最终将它们加载到你的商店。

如果您绝对需要与后端交换自定义数据结构,则可以注册自定义转换,例如:

App.Adapter.registerTransform('mega', {
  deserialize: function(serialized) {
    //do your custom deserialization
  },
  serialize: function(deserialized) {
    //do your custom serialization
  }
});

然后像:

一样使用它
App.MyModel = DS.Model.extend({
  megaValue: DS.attr('mega');
});

希望它有所帮助。