2011-12-28 13 views
1

は、ここに私のコレクションビューの例です:最初の実行時にBACKBONE.JSコレクションこの混乱をバインド

mod.AppListView = Backbone.View.extend({ 
    initialize: function() { 
     var self = this 

     mod.collection.bind('add', self.addOne); 
     mod.collection.bind('reset', self.addAll); 

     _.bindAll(self, 'addOne', 'addAll'); 


     this.addAll(); 
    }, 

    events: { 
    }, 

    addOne: function(myModel) { 
     var view = new ListItemView({ 
     model: myModel 
     }); 
    }, 

    addAll: function() { 
     mod.collection.each(this.addOne); 
    }, 
    }); 

これが正常に動作します。しかしその後のリセットでは、addAllはビューではなくコレクションになり、したがってaddOneは機能しません。

私がしなければならなかった、この修正するには:

mod.collection.bind('reset', self.addAll, this); 

をしかし、私はそれが_.bindAllのポイントだと思いましたか?これをビューに設定してはいけませんか?これは説明できますか?この点がコレクションではなくビューに常に向くようにする方法はありますか?

ありがとうございました。

答えて

5

_.bindAllは、このメソッドへの参照の前に指定する必要があります。あなたはそれを後方に持っています。

_.bindAll(self, 'addOne', 'addAll'); 

    mod.collection.bind('add', self.addOne); 
    mod.collection.bind('reset', self.addAll); 

あなたが_.bindAllを呼び出すと、それはあなたがコンテキストが常に正しく設定されていることを確認するために、飾ら/プロキシ/ラップされたもので指定したメソッドを置き換えます。メソッドが置き換えられているので、メソッドの参照は置換が行われた後に実行する必要があります。そうでなければ、参照は元のメソッドを指しており、_.bindAllは機能していないように見えます。

まで_.bindAllまで3番目のパラメータ...好きなものを選んでください。私は.bindを呼び出すときに3番目のパラメータを渡すことをお勧めしますが、それは私だけです。しかし、私は_.bindAllを使用しなければならない場合があります。両方とも同じことをします、彼らはちょうど異なった方法でそれをします。