2013-04-09 8 views
7

ログインに成功した後、現在のユーザーをJSON形式で返すログインフォームを持つEmberアプリケーションがあります。EmberDataでモデルを手動でロードする

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

属性が正しく設定され、IDを使用して再フェッチする必要がないようにユーザーモデルを読み込むにはどうすればよいですか?

答えて

7

たぶん、adapter.loadを使用しているこれを行うための公式の方法、described in this threadとして:

は、以前は店のいくつかの機能を

データのロード、などload()は、 単一のアダプタを仮定しました。

あなたはこの APIを使用して、(例えば、WebSocketをストリームを通じて)それを求めアプリケーション せずにバックエンドからデータをロードする場合:

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

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

残念ながら、ドキュメンテーションの主張にもかかわらず、残念ながら、サイドロードされたデータは処理されません。

{ 
    person: { 
    id: 1, 
    is_private: false, 
    projects: [3] 
    }, 
    projects: [ 
    { id: 3, name: "FooReader" } 
    ] 
} 
:このコードは find(ID)documented in the RESTAdapter guideとして、サーバから受信することを期待するのと同じ形式でJSONを前提としてい

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); 

注こと:私は個人的にfind(ID)が実装されている方法に基づいており、以下のようなものを使用します

keyForAttributeName(マッピングis_privateisPrivateなど)を使用して設定したすべての変換が適用され、サイドロードされたレコードが処理されます。これがベストプラクティスなのかどうかは分かりませんが、かなりうまくいきます。

+0

ありがとう!私は 'didFindRecord'に近かったが、私はその方法で何が起こっているのか十分に分かっていなかった。 – bschaeffer

+0

こんにちは。この処理は、単一のレコードを作成している間は非常にうまく機能します。複数のレコードを設定するにはどうすればよいですか?例:http://pastebin.com/raw.php?i=NNFVDYR0 – Mattia

+1

これまでのところember-data 1.0.0-beta.3ではこれが動作しなくなったと私は知ることができました。私はこれをember-data 0.14私は答えを使用して終了しました。そして、1.00-beta.3で与えられたandorovが終了しました:http://stackoverflow.com/a/18948134/1477165 – bfcoder

8

数日前、emberデータ1.0ベータ版では、pushPayloadを使用して直接ストアにデータをロードできます。たとえば、データをWebSocket経由でアプリケーションにプッシュする場合(HerokuアドオンPusherを使用します)。あなたは直接source)(店舗でそれを呼び出すことができますし、それが適切なシリアライザを通してそれを渡します:

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

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

NOTEそれが現在単数形のオブジェクト(すなわちpost: {id: 1, post_title:"First!"})をロードしないこと - あなたが持つ複数ようにフォーマットする必要があります配列。

DS.RESTSerializerあなたの代わりにそれを店に合格する必要があり、その場合には、pushPayloadだけでなく(source)を持っている。

、それはそれの実装のように見えるように私は非常に、使用する前に、ソースコードを読んで奨励revになるisited。

+2

私はこれがいつか中断することを完全に期待していますが、少なくともそれは今のところうまくいくものです。私はそれがしないことを望む。私はjsonを複数の配列に変換しなければなりませんでした。 – bfcoder

+0

これは1年以上前に投稿されていますが、今でも完璧に機能しています。これがここにあると思います。 –

0

上記のすべての答えは私のために動作しませんでした。 私のために働いたのは:

this.store.buildRecord(this.store.modelFor('person'), data.id, data) 
関連する問題