イベントハンドラーの割り当て

2015/06/13

前回は、Cape.JS コンポーネントのデータを Ajax で初期化する方法について解説しました。

今回は、HTML 要素に対してイベントハンドラーを割り当てる方法について説明します。


テキストエディタで app/assets/javascripts/todo_list.es6 を開いてください。現時点では、render() メソッドは次のように定義されています。

  render(m) {
    m.ul(m => {
      this.tasks.forEach(task => {
        m.li(m => {
          m.label(m => {
            m.input({ type: 'checkbox', checked: task.done }).sp();
            m.span(task.title);
          });
        });
      });
    });
  }

これを次のように書き換えてください(m.label... の後ろに1行挿入)。

  render(m) {
    m.ul(m => {
      this.tasks.forEach(task => {
        m.li(m => {
          m.label(m => {
            m.onclick(e => this.toggleTask(task));
            m.input({ type: 'checkbox', checked: task.done }).sp();
            m.span(task.title);
          });
        });
      });
    });
  }

挿入されたのは次の1行です。

m.onclick(e => this.toggleTask(task));

この文は click イベントのハンドラーとして this.toggleTask(task) を割り当てます。その対象は、直後に仮想 DOM に追加される要素、すなわちチェックボックスです。

実は、この文では ES6 で導入された簡略表記が用いられています。間略せずに書くと、次のようになります。

m.onclick((e) => { this.toggleTask(task) });

引数が1個のときは引数を囲む括弧が省略できて、関数の中身が1個の文であるときは文を囲む中括弧が省略できます。

次に、イベントハンドラーを定義しましょう。引き続き app/assets/javascripts/todo_list.es6 を編集します。render() メソッド定義の下に次のコードを挿入してください。

  toggleTask(task) {
    window.alert(task.id);
  }

とりあえずチェックボックスのクリックにイベントハンドラーが反応するかどうかを確認するため、警告ダイアロー後を表示させています。

では、動作確認です。サーバーを起動し、ブラウザで http://localhost:3000/ を開きます。1番目のチェックボックスをクリックすると、次のように「1」が警告ダイアローグ内に表示されます。これは、タスクの id カラムの値です。

画面キャプチャ


ちょっと中途半端ですが、今回はここで終わりです。次回は、このイベントハンドラーで Ajax コールを行って、タスクの done カラムの値を更新する方法について説明します。