2013-03-11 9 views
6

私は真に検索しましたが、シリアライザを使用して別のフォーマットのJSON応答からオブジェクトを取得する例はありませんでした。 JSONレスポンスのフォーマットを変更しない理由は、http://flask.pocoo.org/docs/security/#json-securityです。EmberデータとJSONオブジェクトのマッピング

私はまだjavascriptにはあまり良くないので、serialize_json.jsのフックを理解するのは苦労しました。あるいは、私はマッピングを使っているべきです(私は分かりません)。だからここに多くのオブジェクトのための私のJSONレスポンスの例である:

{ 
    "total_pages": 1, 
    "objects": [ 
    { 
     "is_completed": true, 
     "id": 1, 
     "title": "I need to eat" 
    }, 
    { 
     "is_completed": false, 
     "id": 2, 
     "title": "Hey does this work" 
    }, 
    { 
     "is_completed": false, 
     "id": 3, 
     "title": "Go to sleep" 
    }, 
    ], 
    "num_results": 3, 
    "page": 1 
} 

燃えさし-データは、これを使用しようとすると、私は次のエラーを取得する:

DEBUG: ------------------------------- 
DEBUG: Ember.VERSION : 1.0.0-rc.1 
DEBUG: Handlebars.VERSION : 1.0.0-rc.3 
DEBUG: jQuery.VERSION : 1.9.1 
DEBUG: ------------------------------- 
Uncaught Error: assertion failed: Your server returned a hash with the key total_pages but you have no mapping for it 

あなたは私のコードを見たときに完全になり、どのデータストア用:

Todos.Store = DS.Store.extend({ 
    revision: 12, 
    adapter: DS.RESTAdapter.create({ 
     mappings: {objects: "Todos.Todo"}, 
     namespace: 'api' 
    }) 
}); 

私の質問は、私はtotal_pagesnum_resultspageの対処はどうすればよいのですか?そして取引によって、私は無視することを意味するので、objects配列をマップすることができます。

答えて

3

JSONの結果で返すすべてのルートプロパティは、Ember DataのDS.Modelにマッピングされます。モデル化されていないプロパティーは返さないでください。モデル化する必要があります。

エラーを取り除きたい場合は、使用しないプロパティの空のモデルを作成する必要があります。

もっと読むhere

なぜあなたはあなたが使用しない性質を戻ってきていますか?それともあなたのコントロールから外れていますか?

+2

私はモデル化されていないプロパティを返すため、モデル化したくありません。 –

+1

私はレスポンスを変更できますが、JSONSerializerでこれを行うことができるはずです。私はちょうど方法を知らない。私はそれがポイントであることを意味します:JSONを「不規則」にしてember-dataが使用できるものに変換すること。 –

+0

@Willem de Wit - データベースによって追加される_idと__vのプロパティはどうでしょうか?それらをモデル化する必要はありますか? – netpoetica

1

Emberは物事の仕方についてかなり公言しています。 Emberデータも例外ではありません。 Emberチームは、私の意見では、良いことだと思う特定の基準に向かって努力しています。

this postは、emberがどこに行くのかチェックしてください。 TL; DRではAPI呼び出しの実装が非常に多様であるため、JSON APIをサポートするように努力しています。

私の理解から、あなたが求めていることを簡単に実行する方法はありません。あなたの最善の策は、独自のカスタムアダプターを書いてシリアル化することです。これはあまりにも難しいことではありませんし、前に行われています。私はTastypie adapterをPythonのDjango Tastypieで使用することをお勧めします。

1

これを達成する方法は、カスタムシリアライザを使用することです。エンバーデータがシームレスにあなたのAPIを消費できるようにする必要があり

DS.RESTSerilizer.extend({ 
    normalizePayload: function(type, payload) { 
    delete payload.total_pages; 
    delete payload.num_results; 
    delete payload.page; 
    return payload; 
    } 
}); 

:すべてのデータをこの形式でサーバから返された場合は、単にこのようなApplicationSerializerを作成することができます。

関連する問題