2012-03-26 14 views
5

は、私は、次のコードを持っている:バックボーンこの混乱

var GoalPanelView = Backbone.View.extend({ 

    // Bind to the goal panel DOM element 
    el: $("#sidebar-goals"),  

    // Initialize the collection 
    initialize: function() { 
     this.collection = Goals; 
     this.collection.bind('add', this.appendItem); 
    }, 

    // Create a new goal when a user presses enter in the enter goal input 
    createOnEnter: function(e) { 
     if (e.keyCode != 13) return; 
     this.addItem(); 
     //Goals.create(this.newAttributes());   
    }, 

    // Add the goal item to the goal list 
    addItem: function() { 
     var goal = new Goal(); 
     goal.set(this.newAttributes()); 
     var goalsElem = this.el; 
     this.collection.add(goal); 
     $(this.el).children("#enter-goal").val(''); 
    }, 

    // Append DOM element to the parent el 
    appendItem: function(item) { 
     var goalView = new GoalView({ 
      model: item, 
     }); 
     $(this.elem).append(goalView.render().el); 
    } 

}); 

私の問題はappendItem関数の内部にあります。 をappendItemの機能の中に使用すると、ではなくthis.collectionを指していると思います。 thiscollectionではなくGoalPanelViewを参照させるにはどうすればよいですか? this.elemの内容を保持していたappendItem関数に別の変数を渡そうとしましたが、うまくいかなかったようです。私はcollectionappendItem機能を移動し、this.collection.bind('add', appendItem);にバインドするために初期化を変更したときに働い

一つのことでしたが、私はcollectionロジックにviewものを入れたくありません。これと同様に、イベントハンドラをバインドする際

+2

代わりに、初期化関数に '_.bindAll(this)'を入れている。これは、オブジェクト内で呼び出されたすべての関数が、 'this'の値がオブジェクト自体に正しくバインドされて適用されることを保証します。たくさんのコールバックを書く場合に便利です。 – rybosome

答えて

6

あなたはスコープを追加することができます。

this.collection.bind('add', this.appendItem, this); 

範囲は、ハンドラ内thisの値を設定します。あなたの場合は、現在のオブジェクトです。

編集:Javascript Gardenthis.appendItemが実際に関数自体の範囲を運ばない理由偉大な、について説明があり、それだけで関数ポインタではなく、メソッドポインタです。 Javascriptをの癖の一つ..

編集2あなたはまた、あなたのinitialize方法では、アンダースコアの_.bindAll機能を使用することができますBackbone Reference - Events/on

0

:今

initialize: function() { 
    _.bindAll(this); 
    this.collection = Goals; 
    this.collection.bind('add', this.appendItem); 
} 

GoalPanelView上の任意のメソッドへの呼び出し(たとえば、 appendItem)は、thisへの参照がGoalPanelViewインスタンスを参照するようにスコープされます。あなたがスコープにGoalPanelView

のすべてのメソッドをしたくない場合は、文字列としてメソッド名のリストを渡すことができます

はこちらをご覧ください:http://underscorejs.org/#bindAll

2

ただバックボーン0.9のよう(更新します。 2)、これを行うための適切な方法は次のとおりです。


initialize: function() { 
    this.collection.on("add", this.appendItem, this); 
    ... 
} 
があなたのユースケースに応じて、かもしれませんlsoは考慮したい:

initialize: function() { 
    this.listenTo(this.collection, "add", this.appendItem); 
    ... 
} 
+0

これは正しい方法です –

+1

実際には、「this.listenTo」を使用する方が良いでしょう。したがって、removeを呼び出すとイベントのバインドが自動的に行われます。これにより、メモリリークを防ぐことができます。 –