LoginSignup
1
1

More than 5 years have passed since last update.

ExtJS5 - FieldLabelをResponsiveにするTips

Posted at

この記事はSencha Advent Calendar 2014 11日目の記事です。

ExtJS5にてResponsiveプラグインが導入されました。
このResponsiveを利用してフォームのフィールドラベルの位置を変えてみたい
と思います。

やりたいこと

画面幅が狭ければ、フィールドラベルの位置をTOPに、広ければLEFTにすることで
十分な幅の入力フィールドを保つ。

実装

1 - Formの作成

Ext.define("Adventer.view.form.Form",{

    // {{{ extend

    extend: "Ext.form.Panel",

    // }}}
    // {{{ alias

    alias: 'widget.form-form',

    // }}}
    // {{{ controller

    controller: "form-form",

    // }}}
    // {{{ viewmodel

    viewModel: {
        type: "form-form"
    },

    // }}}
    // {{{ title

    title: 'AdventCalendar 2014',

    // }}}
    // {{{ bodypadding

    bodyPadding: 10,

    // }}}
    // {{{ items

    items: [

        {
            xtype: 'textfield',
            fieldLabel: '氏名'
        },
        {
            xtype: 'textfield',
            fieldLabel: '電話番号'
        }


    ]

    // }}}


});

スクリーンショット 2014-12-11 12.39.01.png

2 - レスポンシブプラグインを導入

それぞれのfieldにresponsiveプラグインを導入するため、defaults設定を用意しました。

responsiveConfigは、ひとまず縦長であればlabelAlignをtopに、横長であればleftにするように書きました。

    // {{{ defaults

    defaults: {
        labelWidth: 100,
        plugins: 'responsive',
        responsiveConfig: {
            'tall': {
                labelAlign: 'top'
            },
            'wide': {
                labelAlign: 'left'
            }
        }

    },

    // }}}
    // {{{ items

    items: [

        {
            xtype: 'textfield',
            fieldLabel: '氏名'
        },
        {
            xtype: 'textfield',
            fieldLabel: '電話番号'
        }


    ]

    // }}}

結果

スクリーンショット 2014-12-11 12.51.56.png

textfieldのlabelAlignにはsetterがないとのことです。

3 - アクセサーメソッドを作成

ないなら作ろうと、アクセサーメソッドを作ります。

    // {{{ defaults

    defaults: {
        labelWidth: 100,
        plugins: 'responsive',
        // setter
        setLabelAlign: function(align) {
            this.labelALign = align;
        },
        // getter
        getLabelAlign: function () {
            return this.labelAlign;
        },
        responsiveConfig: {
            'tall': {
                labelAlign: 'top'
            },
            'wide': {
                labelAlign: 'left'
            }
        }

    },

    // }}}

結果
スクリーンショット 2014-12-11 12.57.42.png

エラーは出なくなりましたが、表示は変わりませんでした。

4 - CSSでなんとか……

labelのpositionはcssでやっていたので、クラスのつけ替えで対応してみようと思います。

    // {{{ defaults

    defaults: {
        labelWidth: 100,
        plugins: 'responsive',
        // setter
        setLabelAlign: function(align) {
            var me = this,
                labelEl = Ext.get(me.labelEl);

            me.labelAlign = align;

            // ラベルがありません
            if (!labelEl) return;

            if (align === 'top') {
                labelEl.addCls('x-form-item-label-top');
            } else {
                labelEl.removeCls('x-form-item-label-top');
                // left時は幅の設定が必要
                labelEl.setWidth(me.labelWidth);
            }

        },
        // getter
        getLabelAlign: function () {
            return this.labelAlign;
        },
        responsiveConfig: {
            'tall': {
                labelAlign: 'top'
            },
            'wide': {
                labelAlign: 'left'
            }
        }

    },

    // }}}

スクリーンショット 2014-12-11 12.57.42.png

スクリーンショット 2014-12-11 13.10.58.png

無理矢理感が強いですが、なんとかなりました。

responsiveプラグインにより、画面サイズの変更でsetLabelAlignが呼ばれ、
その中でlabelの位置を変更させています。

まとめ

  • Responsiveはアクセサーメソッドがないと使えない
  • アクセサーメソッドを作っても、レイアウトは簡単には変えられない。

もっと上手なやり方がありそうな気もしますが、なんとか目的は果たせました。

明日は sugaimasaruさんです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1