2012-01-05 10 views
0

私はknockout.jsからのバックボーンに新しいことがあります。私はこの単純なこぶを乗り越えようとしています。私はボタンをクリックして、Chromeのコンソールを見てみるとbackbone.jsでフェッチした後にモデルデータを表示するには

[{"id": "1233","name": "Karen","grade": "C"},{"id": "1234","name": "Susan", "grade": "F"}] 

が、私は以下を参照してください:

$(function(){ 
    window.Student = Backbone.Model; 

    window.Students = Backbone.Collection.extend({ 
     model: Student, 
     url: 'test.php' 
    }); 

    window.students = new Students(); 
    window.AppView = Backbone.View.extend({ 
     el: $('#container'), 
     initialize: function() { 
      Students.bind('reset', this.render); 
     }, 
     render: function(){ 
      console.log(Students.toJSON()); 
     } 
    }); 

    window.appview = new AppView(); 

$('#test').click(function(){ 
    //var students = new Students(); 
     students.fetch(); 
     var q = students.toJSON(); 
     console.log(q); 
    /*  
     students.create({ 
      name: 'John', 
      grade: 'A' 
     }); */ 
    }) 
}); 

私のサーバーは、以下のJSONを送信:私はこのコードを持っている

まずクリック:

[] - Corrected -just an empty array 

セカンドクリック:

[ 
Object 
    grade: "C" 
    id: "1233" 
    name: "Karen" 
    __proto__: Object 
, 
Object 
    grade: "F" 
    id: "1234" 
    name: "Susan" 
    __proto__: Object 
] 

最初の質問はなぜ2回のクリックかかりますか? Second:テキストボックス、<li>またはその他のUI要素にグレードを(コレクションとIDの両方として)割り当て/バインドするにはどうすればよいですか(Ajaxがポップインするときにはそれをよりよく観察できます)。

+3

使用 'window.Student = Backbone.Model.extend({});'の代わりに元のラインのは、 '自体をこのようにオブジェクトBackbone.Model'割り当てるため。 [Backbone.ModelBinding](https://github.com/derickbailey/backbone.modelbinding)プラグインも参照してください。 – kubetz

答えて

7

表示されているコンソールメッセージは、クリックイベントハンドラからのメッセージです。レンダリングメソッドからのコンソールメッセージは決して呼び出されません。

fetchは非同期メソッドなので、最初のログメッセージに何も表示されないので、の直後にfetchの後にコールすると、コレクションはフェッチメソッドからまだ入力されていません。

期待どおりに動作させるには、コードを変更する必要があります。

まず、あなたはあなたがコンストラクタに渡されたコレクションのリセットイベントにバインドする必要があるビュー内のビュー次に

//original 
window.appview = new AppView(); 
//new 
window.appview = new AppView({ collection: window.students }); 

をインスタンス化するとき、コレクションに渡す必要があります。

window.AppView = Backbone.View.extend({ 
     el: $('#container'), 
     initialize: function() { 
      _.bindAll(this, 'render'); 
      this.collection.bind('reset', this.render); 
     }, 
     render: function(){ 
      console.log(this.collection.toJSON()); 
     } 
    }); 

今すぐあなたのクリックイベントにコンソールログメッセージをコメントアウト(あなたがインスタンス化されたオブジェクトにバインドする必要があり、そしてあなたのようなオブジェクトの定義は、もともとやっていたではない)、そして、あなたは一度だけクリックする必要がありますレンダリングメソッドからのコンソールログメッセージが表示されます。

$('#test').click(function(){ 
    //var students = new Students(); 
     students.fetch(); 
     //var q = students.toJSON(); 
     //console.log(q); 
    /* 
     students.create({ 
      name: 'John', 
      grade: 'A' 
     }); */ 
    }) 
+3

非常によく書かれた答え。誰かが作業コードで遊んでみたいと思ったら - ** [こちらはこちらです](http://jsbin.com/awahog/2/edit#javascript、live)**。 – kubetz

+0

私が得た:キャッチされない例外TypeErrorを:未定義 window.AppView.Backbone.View.extend.renderindex.phpの 'toJSON' メソッドを呼び出すことはできません:85 Backbone.Events.triggerbackbone.js:115 _.extend.resetbackbone.js: 479 _.extend.fetch.options.successbackbone.js:492 f.Callbacks.njquery.min.js:2 f.Callbacks.o.fireWithjquery.min.js:2 wjquery.min.js:4 f.support.ajax.f.ajaxTransport.send.d – Len

+0

@Lenは 'render'の中の' this.model'を 'this.collection'に変更します。上記のコメントの私のリンクも見てください。 – kubetz