4

ember アプリケーションを ember-data v0.13からv1.0.0に移行しています。

バージョン v0.13 では、RESTSerializerレール STI モデルを ember モデルにマップできるマテリアライズ コールバックがありました。

したがって、さまざまなタイプのイベントのリストを取得したら、それぞれを適切な ember モデルに変換します

"events": [
    {
        "id": 1,
        "type": "cash_inflow_event",
        "time": "2012-05-31T00:00:00-03:00",
        "value": 30000
    },
    {
        "id": 2,
        "type": "asset_bought_event",
        "asset_id": 119,
        "time": "2012-08-16T00:00:00-03:00",
        "quantity": 100
    }
]

エンバーモデル

App.Event = DS.Model.extend({...})
App.AssetBoughtEventMixin = Em.Mixin.create({...})
App.AssetBoughtEvent = App.Event.extend(App.AssetBoughtEventMixin)
App.CashInflowEventMixin = Em.Mixin.create({...})
App.CashInflowEvent = App.Event.extend(App.CashInflowEventMixin)

STI のような Ember モデルを作成した Ember-data コード v0.13

App.RESTSerializer = DS.RESTSerializer.extend({
    materialize:function (record, serialized, prematerialized) {
        var type = serialized.type;
        if (type) {
            var mixin = App.get(type.classify() + 'Mixin');
            var klass = App.get(type.classify());
            record.constructor = klass;
            record.reopen(mixin);
        }
        this._super(record, serialized, prematerialized);
    },

    rootForType:function (type) {
        if (type.__super__.constructor == DS.Model) {
            return this._super(type);
        }
        else {
            return this._super(type.__super__.constructor);
        }
    }
});

ember-data v1.0.0で同じことを行うにはどうすればよいですか?

4

2 に答える 2

2

私は解決策を持っていると思います...

モデルには setupData コールバックがあります。私は次のことをしました

App.Event = DS.Model.extend({
    ...
    setupData:function (data, partial) {
        var type = data.type;
        if (type) {
            var mixin = App.get(type.classify() + 'Mixin');
            this.reopen(mixin);
        }
        delete data.type;
        this._super(data, partial);
    },
    eachAttribute: function() {
        if(this.get('type')){
          var constructor = App.get(this.get('type').classify());
          constructor.eachAttribute.apply(constructor, arguments);
        }
        this._super.apply(this, arguments);
     }
});

Emberの専門家、これは良い考えですか??

于 2013-10-26T00:08:59.380 に答える
1

まず、Rails を使用しているため、ActiveModelAdapter を使用して、そのシリアライザーからカスタム シリアライザーを拡張することができます。

App.ApplicationAdapter = DS.ActiveModelAdapter;
App.ApplicationSerializer = DS.ActiveModelSerializer.extend({...});

カスタムシリアライザーはtypeForRoot& おそらくをオーバーライドする必要があるようnormalizeです。これらのメソッドは次のようになります。

DS.ActiveModelSerializer#typeForRoot:

typeForRoot: function(root) {
  var camelized = Ember.String.camelize(root);
  return Ember.String.singularize(camelized);
}

DS.JSONSerializer#normalize:

normalize: function(type, hash) {
  if (!hash) { return hash; }

  this.applyTransforms(type, hash);
  return hash;
}
于 2013-10-25T06:51:32.330 に答える