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

Backbone.js入門 その2

こんばんは、south37です。
今日も前回に引き続き、Backbone.jsを勉強していこうと思います。

Events編

さて、今回扱うのはBackboneのEventsです。これは、その名の通りイベントを扱うオブジェクトです。Eventsではイベントの監視(on, listenTo)、解除(off, stopListening)、イベントの発火(trigger)を扱う事が出来て、Backboneの各コンポーネント(ModelやView, Router等)間の依存関係を粗結合にする役割を果たします。
Backboneの仕組みとしては、各コンポーネントがEventsオブジェクトを継承した形で実装されている為、各コンポーネントに対してイベントを設定して行く事になります。実際に例を見てみましょう。

var Memo = Backbone.Model.extend({
    defaults: {
        "content": ""
    },
    validate: function (attrs) {
        if (atts.content === "") {
            return "content must not be empty.";
        }
    }
});
 
var MemoList = Backbone.Collection.extend({
    model:Memo,
    url:"/memos"
});
 
var memoList = new MemoList();

まず、ModelとCollectionを上記の様に定義します*1。次に、作成したModelとCollectionが発行するイベントを監視する為のobserverオブジェクトを作成します。

var observer = {
    showArguments: function () {
        console.log("+++observer.showArguments: ");
        _.each(arguments, function (item, index) {
            console.log("  +++arguments[" + index + "]: " + JSON.stringify(item));
        });
    }
};

_.extend(observer, Backbone.Events);
observer.listenTo(memoList, "all", observer.showArguments);

作成したobserverに対してunderscore.jsのextendでBackbone.Eventsのメソッドを追加し、listenToメソッドでmemoListのイベントを監視します。このとき、listenToの第二引数を"all"にしている為、memoListがどんなイベントを発行してもobserver.showArgumentsが呼び出されます*2。この"all"を特定のイベント名にする事で、特定のイベントを監視する事が出来ます。

Collectionの様々なメソッド呼び出し(add, change, remove等)はイベント発行を伴う為、observerで監視する事が出来ます。

var memo = new Memo({content: "OK"});

memoList.add(memo);
出力
+++observer.showArguments:
  +++arguments[0]: "add"
  +++arguments[1]: {"content":"OK"}
  +++arguments[2]: [{"content":"OK"}]
  +++arguments[3]: {"merge":false,"add":true,"remove":false}

実際に、addメソッド呼び出し時にshowArgumentsが呼び出される事が確認出来ました。

上記の例では、observerに対してlistenToを呼び出してイベント監視の設定をしていましたが、observerを設けずにイベントを発行するオブジェクトそのものにコールバックメソッドをバインドする事も出来ます。その場合にはonメソッド(bindメソッド)を呼び出せばよく、

model.on(event名, callback関数, [context]);

のように設定します。また、イベント監視の解除も出来て、off(unbind)メソッドやstopListeningメソッドを使えばOKです。

今日はここまでです。

*1:validateというのはsaveメソッドを呼び出すと実行されるメソッドで、modelのattributesを引数として実行され、invalidであればエラーメッセージかerrorオブジェクトを返します。上記の例では、modelのcontentがデフォルトの空文字列の場合にエラーメッセージを返すようになっています。

*2:showArgumentsの中で出てくるargumentsというのはJavaScriptが関数実行時にデフォルトで作り出すオブジェクトで、関数に渡された引数が全て配列上に格納されています。argumentsを使う事で、任意の数の引数に対応する関数を定義出来ます。