vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

Backbone.jsを使ってみる 2

前回の補足。

Viewのイベント・メソッドを指定する部分「events:{}」で、イベントを取得するID・クラス名を指定する方法について。

viewTab.slim

section#tab_frame
    input#arrow_button_left.button_arrow type="button"
        label.arrow_label for="arrow_button_left" <
    input#tab_0.tab_radio type="radio" name="tabs" data-tab-num='0'
        label#tab_label_0.tab_label for="tab_0"
    input#tab_1.tab_radio type="radio" name="tabs" data-tab-num='1'
        label#tab_label_1.tab_label for="tab_1" タブ2
    input#tab_2.tab_radio type="radio" name="tabs" data-tab-num='2'
        label#tab_label_2.tab_label for="tab_2" タブ3
    input#tab_3.tab_radio type="radio" name="tabs" data-tab-num='3'
        label#tab_label_3.tab_label for="tab_3" タブ4
    input#tab_4.tab_radio type="radio" name="tabs" data-tab-num='4'
        label#tab_label_4.tab_label for="tab_4" タブ5
    input#arrow_button_right.button_arrow type="button"
        label.arrow_label for="arrow_button_right" >
〜省略〜

javascript.js

(function () {
〜省略〜
    var DEFAULT_RIGHT_TAB_NUM = 2;
    var TabView = Backbone.View.extend({
        el: '#tab_frame',
        events: {
            'change .tab_radio': 'movePage',
            'click .button_arrow': 'moveTab'
        },
        moveTab: function (e){
            switch (e.target.id){
            case 'arrow_button_left':
                // 一つ左隣のTabを表示.
                intRightTabNum--;
                updateTabStyles();
                break;
            case 'arrow_button_right':
                // 一つ右隣のTabを表示.
                intRightTabNum++;
                updateTabStyles();
                break;
            }
        },
        movePage: function (e) {
            var strTargetId = '#' + e.target.id;
            var intNewPageNum = jQuery(strTargetId).data('tabNum');
            location.href='?tab=' + intNewPageNum + '&lrt=' + intRightTabNum;
        }
    });
    var view = new TabView();

〜省略〜

    this.updateTabStyles = function(){
        // 矢印ボタンのEnable/Disableを設定.
        document.getElementById("arrow_button_left").disabled = (intRightTabNum <= intDefaultRightTabNum);
        document.getElementById("arrow_button_right").disabled = (intRightTabNum >= 4);
        
        // Tabの表示切り替え
        document.getElementById("tab_" + intTabNum).checked = true;
        intTabLeftNum = intRightTabNum - 2;
        for(var i=4;i>=0;i--){
            document.getElementById(aryTabName[i]).style.display = ((i >= intTabLeftNum)&&(i <= intRightTabNum))? "block": "none";
        }
    };

なんのことはない、イベントを取得したい要素の親のID・クラスを「el」に指定してやればOKのようです(前も試したような気はするのですが、何かを間違えていたのかもしれません)。

ついでにタブ(ラジオボタン)の左右に表示している矢印ボタンもViewに追加してみました。

個別にメソッドを追加していた以前の状態に比べると、整理された感じがしますね。

Before

javascript.js

(function () {

〜省略〜

    this.moveTabRight = function(){
        // 一つ右隣のTabを表示.
        if(intRightTabNum <= 3){
            intRightTabNum++;
        }
        updateTabStyles();
    };
    this.moveTabLeft = function(){
        // 一つ左隣のTabを表示.
        if(intRightTabNum > 0){
            intRightTabNum--;
        }
        updateTabStyles();
    };
    this.updateTabStyles = function(){
        // 矢印ボタンのEnable/Disableを設定.
        document.getElementById("arrow_button_left").disabled = (intRightTabNum <= intDefaultRightTabNum);
        document.getElementById("arrow_button_right").disabled = (intRightTabNum >= 4);
        
        // Tabの表示切り替え
        document.getElementById("tab_" + intTabNum).checked = true;
        intTabLeftNum = intRightTabNum - 2;
        for(var i=4;i>=0;i--){
            document.getElementById(aryTabName[i]).style.display = ((i >= intTabLeftNum)&&(i <= intRightTabNum))? "block": "none";
    };
〜省略〜