読者です 読者をやめる 読者になる 読者になる

jQuery、underscore.js、backbone.jsのbindメソッドについて


backbone.jsのサンプルコードを読んでいると、bindという名前のメソッドがよく使われてます。

そして、bindという名前のメソッドはbackbone.jsにも、underscore.jsにも、jQueryにも定義されています。

慣れている人は問題ないのでしょうが、私は読んでいて混乱したので、それぞれの定義と、サンプルで使い方をまとめておきたいと思います。

backbone.jsのbindメソッド

   object.bind(event, callback, [context])

レシーバオブジェクトの'change'や'destroy'などのイベントに、コールバックを紐付けます。
第3引数にcontextを渡すことによって、callback実行時の「this」を設定できます。


jQueryのbindメソッド

   .bind( eventType [, eventData] , handler(eventObject) )

要素が持つ、例えば”click”などのDOMイベントに対してコールバック関数を紐付けます。
eventDataはコールバック関数に渡されます。

underscore.jsのbindメソッド

    _.bind(function, object, [*arguments]) 

functionを実行する「関数」を返します。
functionで参照される「this」にはobjectが使われます。
argumentsを渡すと、functionに渡す引数をあらかじめ指定しておくことができます。(カリー化)

backbone.jsで使うときの使用例

backbone.jsのexampleにあるtodosのBackbone.Viewの例です。

    window.TodoView = Backbone.View.extend({

	//... is a list tag.
	tagName:  "li",

	// Cache the template function for a single item.
	template: _.template($('#item-template').html()),

	// The DOM events specific to an item.
	events: {
	    "click .check"              : "toggleDone",
	    "dblclick div.todo-text"    : "edit",
	    "click span.todo-destroy"   : "clear",
	    "keypress .todo-input"      : "updateOnEnter"
	},

	// The TodoView listens for changes to its model, re-rendering.
	initialize: function() {
	    this.model.bind('change', this.render, this);
	    this.model.bind('destroy', this.remove, this);
	},

	// Re-render the contents of the todo item.
	render: function() {
	    $(this.el).html(this.template(this.model.toJSON()));
	    this.setText();
	    return this;
	},

	// To avoid XSS (not that it would be harmful in this particular app),
	// we use `jQuery.text` to set the contents of the todo item.
	setText: function() {
	    var text = this.model.get('text');
	    this.$('.todo-text').text(text);
	    this.input = this.$('.todo-input');
	    this.input.bind('blur', _.bind(this.close, this)).val(text);
	},


initializeで、backbone.jsのbindを使用してます。

Viewが保持しているmodelに'change'イベントが発生したときにrenderを、'destroy'イベントが発生したときにremoveをコールするように紐付けています。

    initialize: function() {
        this.model.bind('change', this.render, this);
        this.model.bind('destroy', this.remove, this);
    },


またrenderから呼ばれるsetTextの内部でbindが使われてます。

    this.input = this.$('.todo-input');
    this.input.bind('blur', _.bind(this.close, this)).val(text);

1つ目のbindはjQueryのbindです。.todo_inputにblurイベントに、コールバック関数を紐付けてます。
紐付けているコールバック関数は、underscore.jsのbindの戻り値です。
underscore.jsのbindはclose関数をthisのコンテキストで呼ぶ関数を作成していて、これがjQueryのbindに渡されています。