2012-06-17 4 views
15

ページの読み込み時に、this techniqueで自分のデータを自分のコレクションにブートストラップしています。それはうまくいきますが、私はサブモデルも持っているので問題に遭遇しています。サブモデルもキャストする必要があります。backbone.js - フェッチを呼び出さずに構文解析を使用する

たとえば、BookというJSONコレクションが返され、各ブック配列にはPagesという10-20個のモデルが含まれています。ページに直接アクセスしようとすると、[object][object]というエラーが表示されます。なぜなら、バックボーンはそのオブジェクトの種類がわからないからです。

以前はfetchを使用していたときに、parseアクションを含むコレクションを使用してこれを回避しました。 parseでは私のようなものだろう:

Collection_Books = Backbone.Collection.extend({ 
    model: Model_Book, 
    parse: function (response) { 
     response.Pages = new Collection_Pages(response.Pages); 
     return response; 
    } 
}); 

を今、私は直接データにアクセスするとfetchを使用していないことを、ドキュメントが、私はもはやparseメソッドへのアクセス権を持っていることを意味しません。

fetchを使用していない場合や、ページが読み込まれているサーバーを呼び出す場合は、書籍>ページの例を使用してサブモデルをキャストするにはどうすればよいですか?

+0

コンストラクタ/初期化メソッドを少し調整しても問題がなければ、確かにそこに子モデルを設定できます。このポストの最後にもう少し詳しく:http://bit.ly/KKHItJ – rjz

+0

あなたの_テクニック_リンクは壊れています – Madbreaks

答えて

11

更新:この回答は最新ではありません。最新情報はuglymunky's answerを参照してください。あなたは正しい


parseあなたは、生データからコレクションを構築しているときに、それが呼ばれることはありませんonly specified to be called during fetchです。

しかし、あなたはあなたのコレクションをブートストラップするために使用している生データを制御するので、あなた自身、あなたのコレクションのparseを呼び出すことができます。

var c = new YourCollection(
    YourCollection.prototype.parse([ 
     // attribute data goes here... 
    ]) 
); 

デモ:http://jsfiddle.net/ambiguous/kdaZ3/

あなたparse方法(両方のコレクションモデル)は呼び出しコンテキストを気にするべきではないので、プロトタイプから直接呼び出しても問題ありません。

modelInstance = new MyModel(obj, {parse: true}); 

:これは新しいですが、あなたはまた、ちょうどそのため、あなたの解析メソッドを使用するようにコンストラクタを言って、trueに自分のコンストラクタにオプションパラメータのparseプロパティを設定することができますようにそれが見える場合

+1

私はこれがbackbone.jsで私を救済したのは3度目だと思います。あなたにはもう一度感謝しています:) – boolean

56
+1

注:コレクションコンストラクタでも同様です。 var books =新しいコレクション_Books(json、{parse:true}); – Element

+2

これは現在受け入れられている回答でなければなりません... – Ben

+0

これは新しい動作です。質問があったときにバックボーンにこのオプションがありませんでした。私は、「受け入れ」が切り替わるまで待たなければならないと思う。 –

関連する問題