1

私はこれらの2つのリソースを持っています:

App.Users = DS.Model.extend({
    first_name: DS.attr('string'),
    last_name: DS.attr('string'),
    email: DS.attr('string'),
    userprofile: DS.belongsTo('App.Userprofiles', {embedded:true}),
    fullName: function() {
        return this.get('first_name') + ' ' + this.get('last_name');
    }.property('first_name', 'last_name'),
    didLoad: function() {
        console.log('Developer model loaded', this);
    }
});

App.Userprofiles = DS.Model.extend({
    company: DS.attr('string'),
    user: DS.belongsTo('App.Developers'),
    didLoad: function() {
        console.log('Developer Profile model loaded', this);
    }
})

これらは私の見解とコントローラーです:

App.UserInfoController = Ember.ObjectController.extend({
    content: App.store.find(App.Users, 1),
}).create();

App.UserInfoView = Ember.View.extend({
    controller: App.UserInfoController,
    contentBinding: 'controller.content'
});

これは私のAPIからのユーザーへのサンプル応答です

{
  "email": "foo@gmail.com",
  "first_name": "George",
  "id": "1",
  "last_name": "Eracleous",
  "resource_uri": "/api/v1/users/1/",
  "userprofile": {
    "company": "bar",
    "id": "1",
    "resource_uri": "/api/v1/userprofiles/1/",
    "user": "/api/v1/users/1/"
  }
}

ユーザーオブジェクトは正しくロードされますが、get( "userprofile")を実行しようとするとnullになります。誰かが私が間違っていることを知っていますか?

4

1 に答える 1

1

埋め込まれた関連オブジェクトをロードするには、「map」関数を呼び出して、アダプターが使用するシリアライザーを構成する必要があります。これを行うために私が知っている唯一の方法は、シリアライザーをサブクラス化し、それに「init」関数を追加することです。ここで、mapに必要な呼び出しを行います。すべてのモデルクラスの埋め込まれた関係ごとに、「map」を呼び出す必要があります。これは、to-oneおよびto-manyの関係に適用されます。このシリアライザーを使用するようにアダプターを構成してください。例については、前の質問に対する私の回答を参照してください。この例をオンラインで確認することもできます。

コメントで述べたように、シリアライザーをサブクラス化し、イニシャライザーでそのmap()関数を呼び出す代わりに、アダプタークラスでmap()を直接呼び出すことができます。例として、これを行う私自身のコードの抜粋を次に示します。

WO.RESTAdapter.map(App.Category, {
 resourceTypes: {
  embedded: 'load'
}
});
WO.RESTAdapter.map(App.Resource, {
 resourceType: {
  embedded: 'load'
 }
});
WO.RESTAdapter.map(App.Reservation, {
 resource: {
  embedded: 'load'
 },
 user: {
  embedded: 'load'
 }
});
App.serializer = App.WOSerializer.create();
App.store = DS.Store.create({
 revision: 10,
 adapter: WO.RESTAdapter.create({
  namespace: "cgi-bin/WebObjects/Reserve.woa/ra",
  serializer: App.serializer
 }),
 serializer: App.serializer,
 adapterForType: function(type){
  return this.get('adapter');
 }
});
于 2012-12-18T13:25:57.840 に答える