ログインが成功した後に現在のユーザーを JSON 形式で返すログインフォームを備えた Ember アプリがあります。
UsingcreateRecord
は、返された JSON 属性をモデルに直接設定します。たとえば、ではなくにis_private
なります。user.is_private
user.get('isPrivate')
属性が正しく設定され、id を使用して再取得する必要がないように、ユーザー モデルをロードするにはどうすればよいですか?
ログインが成功した後に現在のユーザーを JSON 形式で返すログインフォームを備えた Ember アプリがあります。
UsingcreateRecord
は、返された JSON 属性をモデルに直接設定します。たとえば、ではなくにis_private
なります。user.is_private
user.get('isPrivate')
属性が正しく設定され、id を使用して再取得する必要がないように、ユーザー モデルをロードするにはどうすればよいですか?
数日前の 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.RESTSerializer
pushPayload
( source ) もあります。その場合は、代わりにストアに渡す必要があります。
実装が見直されるようですので、使用する前にソースコードを読むことを強くお勧めします。
おそらく、これを行う公式の方法は、このスレッドで説明され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_private
isPrivate
上記のすべての答えは私にとってはうまくいきませんでした。私にとってのみうまくいったのは:
this.store.buildRecord(this.store.modelFor('person'), data.id, data)