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

初心者のためのExtJS入門

ExtJSを使うので、ついでにまとめていきます

チュートリアル:基本的なコンポーネントを使ってみる

コンポーネントの配置

Example(http://examples.sencha.com/extjs/6.2.0/examples/kitchensink/#components)を見ながら、ExtJSが標準で提供しているコンポーネントを試してみました。

どんなものがあるかは、Exampleを見るのが一番だと思います。

/**
 * ビューポートクラス。
 *
 * @class Memo.view.main.Main
 * @extend Ext.Panel
 */
Ext.define('Memo.view.main.Main', {
    extend: 'Ext.Panel',
    xtype: 'app_main',

    items: [
        {
            xtype: 'form',
            items: [
                {
                    xtype: 'textfield',
                    emptyText: 'テキストを入力してください'
                },
                {
                    xtype: 'button',
                    text: '保存'
                }
            ]
        },
        {
            xtype: 'dataview',
            tpl: [
                '<tpl for=".">',
                    '<div class="item">{text}</div>',
                '</tpl>'
            ],
            itemSelector: 'div.item',
            store: {
                proxy: 'memory',
                data: [
                    { text: 'アイテム1' },
                    { text: 'アイテム2' },
                    { text: 'アイテム3' }
                ]
            }
        }
    ]
});

itemsコンフィグを使って、コンポーネントを配置することができます。

xtype: 'form'のように記載していますが、ここにはエイリアス名を指定します。つまり最初にフォームパネルを設置していることになります。

さらに、フォームパネル内にitemsコンフィグを使ってテキストフィールドとボタンを設置しています。

あとデータビューを設置しました。dataview(データビュー)は、一覧表示する場合に使うコンポーネントで、ストアに格納されたデータを表示します。

f:id:sham-memo:20170110233006p:plain

コンポーネントを連動してみる

やってみたいのは、テキストフィールドに入力した文字列を保存ボタンでデータビューに転記する、といった感じです。

/**
 * ビューポートクラス。
 *
 * @class Memo.view.main.Main
 * @extend Ext.Panel
 */
Ext.define('Memo.view.main.Main', {
    extend: 'Ext.Panel',
    xtype: 'app_main',

    items: [
        {
            xtype: 'form',
            items: [
                {
                    xtype: 'textfield',
                    emptyText: 'テキストを入力してください'
                },
                {
                    xtype: 'button',
                    text: '保存',
                    handler: function () {
                        var textfield = this.up().getComponent(0),
                            value = textfield.getValue(),
                            dataview = this.up('app_main').down('dataview'),
                            store = dataview.getStore();

                        store.add({ text: value });
                    }
                }
            ]
        },
        {
            xtype: 'dataview',
            tpl: [
                '<tpl for=".">',
                    '<div class="item">{text}</div>',
                '</tpl>'
            ],
            itemSelector: 'div.item',
            store: {
                proxy: 'memory',
                data: [
                    { text: 'アイテム1' },
                    { text: 'アイテム2' },
                    { text: 'アイテム3' }
                ]
            }
        }
    ]
});

ボタンのhandlerコンフィグに関数を指定することで、ボタンを押したときに実行される処理を定義できます。関数内でのthisは保存ボタン自身なので、そこから親のコンポーネントを辿ってアクセスしています。upやdownメソッドを使って親や子のコンポーネントを参照しています。引数にエイリアス名を指定することもできます。

最後にテキストフィールドから取得した値を、ストアに追加することでデータビューに反映できました。

f:id:sham-memo:20170110233105p:plain

ただ、さすがにこれでは無理やりすぎるので、次はリファクタリングしてみようと思っています。