8

ログインが成功した後に現在のユーザーを JSON 形式で返すログインフォームを備えた Ember アプリがあります。

UsingcreateRecordは、返された JSON 属性をモデルに直接設定します。たとえば、ではなくにis_privateなります。user.is_privateuser.get('isPrivate')

属性が正しく設定され、id を使用して再取得する必要がないように、ユーザー モデルをロードするにはどうすればよいですか?

4

4 に答える 4

9

数日前の ember データ 1.0 ベータ版では、pushPayloadデータをストアに直接ロードするために使用できます。たとえば、WebSockets を介してアプリにデータをプッシュする場合 (Heroku アドオンのPusherを使用します)。ストア (ソース)で直接呼び出すことができ、適切なシリアライザーを介して渡されます。

var postsJSON = {
  posts: [
    {id: 1, post_title: "Great post"}
  ]
}

this.store.pushPayload('post',postsJSON)

現在、単数形のオブジェクト (つまり ) をロードしないことに注意してpost: {id: 1, post_title:"First!"}ください。配列を使用して複数形としてフォーマットする必要があります。

DS.RESTSerializerpushPayload( source ) もあります。その場合は、代わりにストアに渡す必要があります。

実装が見直されるようですので、使用する前にソースコードを読むことを強くお勧めします。

于 2013-09-22T19:55:16.063 に答える
7

おそらく、これを行う公式の方法は、このスレッドで説明されadapter.loadているように、を使用することです:

データのロード

以前は、ストアの一部の機能 ( などload()) は単一のアダプターを想定していました。

アプリケーションが要求することなく (たとえば、WebSockets ストリームを介して) バックエンドからデータをロードする場合は、次の API を使用します。

store.adapterForType(App.Person).load(store, App.Person, payload);

この API は、サイドロードされた埋め込みデータも処理します。今後、この API のより便利なバージョンを追加する予定です。

しかし残念なことに、ドキュメンテーションが主張していることにもかかわらず、サイドロードされたデータを処理しません。find(ID)私は個人的に次のようなものを使用します。これは実装方法に基づいています。

var id = json["person"]["id"];
var store = DS.get("defaultStore");
var adapter = store.adapterForType(App.Person);
adapter.didFindRecord(store, App.Person, json, id);
var person = App.Person.find(id);

このコードは、RESTAdapter ガイドに記載されているfind(ID)ように、サーバーから受信するのと同じ形式の JSON を想定していることに注意してください。

{
  person: {
    id: 1,
    is_private: false,
    projects: [3]
  },
  projects: [
    { id: 3, name: "FooReader" }
  ]
}

これにより、(へkeyForAttributeNameのマッピングなど)を使用して構成したすべての変換が適用され、サイドロードされたレコードが処理されます。これがベストプラクティスかどうかはわかりませんが、非常にうまく機能します。is_privateisPrivate

于 2013-04-09T16:30:08.737 に答える
0

上記のすべての答えは私にとってはうまくいきませんでした。私にとってのみうまくいったのは:

this.store.buildRecord(this.store.modelFor('person'), data.id, data)
于 2017-01-03T09:02:09.367 に答える