2017-03-27 2 views
0

私は、常に存在する事前定義された属性のセットと、ユーザーによって定義されたその他のカスタムプロパティを持つデータモデルを作成しています。Emberデータモデルにプロパティを動的に定義する

企業には多くの役割があります。このシステムを使用する各企業は、すべてのロールが異なる会社にまたがっている固定セットのプロパティに加えて、すべてのロールのカスタムプロパティを定義する必要があります。

アイデアはその後、JSON-APIにおける役割のペイロードがすべての属性、カスタムかどうかが付属していることを次のようになります。namesalaryは関係なく、すべてのロールに存在するデフォルトの属性、あり、上記の役割の中で

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

会社であるが、favoriteColorは、このロールを所有する特定の会社がすべての役割に対して必要としていたものとして定義されたカスタム属性です。

私はこれらのカスタムロールモデルの定義に属性を定義することができなくなりますことを考えると、Ember社のデータを使用して、このようなもので逃げることができれば、私は思ったんだけど:

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

事項を作成するにはさらに悪いことに、これらのカスタム属性は必ずしも文字列値ではなく、型の指定も可能です。したがって、会社はstringタイプのfavoriteColorと、タイプdatebirthDateを持つことを望むかもしれません。

答えて

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') 
}) 
0

使用カスタマイズjsonaデータフォーマッタは、燃えさしの作成に非常に役立つかもしれませんデータモデルを自動的に作成します。また、emberデータモデルから正しいJSONを自動的に作成することもできます:

関連する問題