Extjs5.0(8):Panel组件

Panel很简单,以至于我不知道如何开始这篇文章,直接上代码吧。

 

1、BasicPanel

 

上一篇文章我们已经在view包中创建了一个panel包,还建了一个BasicPanels.js文件,我们这里直接使用这个BasicPanels.js,在里面添加几个基本的panel.

BasicPanels.js:

Ext.define('MyApp.view.panel.BasicPanels', {
    extend: 'Ext.Container',
    xtype: 'basic-panels',
    width: 660,
    requires: [
        'Ext.layout.container.Table'
    ],

    layout: {
        type: 'table',
        columns: 3,
        tdAttrs: { style: 'padding: 10px; vertical-align: top;' }
    },

    defaults: {
        xtype: 'panel',
        width: 200,
        height: 280,
        bodyPadding: 10
    },
    initComponent: function () {
        this.items = [
            {
                html:'我没有标题'
            },
            {
                title: 'Title',
                html: '我有标题'
            },
            {
                title: 'Collapsible',
                collapsible: true,
                html: '我能收缩'
            },
            {
                title: 'Tools',
                collapsible: true,
                width: 640,
                html: '我有工具栏',
                tools: [
                    { type:'pin' },
                    { type:'refresh' },
                    { type:'search' },
                    { type:'save' }
                ],
                colspan: 3
            }
        ];

        this.callParent();
    }
});

浏览器中运行项目,点击左侧树节点Basic Panel,效果图。


注意:如果运行时没有出现以上效果,可能是因为报错找不到该组件。如果出现这样的问题,请确保你的项目是运行在sencha app watch下,这样子sencha cmd才能检测到项目的改变(例如我们这里新增了一个文件)。

如何执行sencha app watch我前面的文章有介绍过,这里再讲一次

打开cmd,切换到项目目录下,执行 sencha app watch


这样就开启了sencha app watch

继续上面的代码,可能比较难理解的是下面两段代码

layout: {
    type: 'table',
    columns: 3,
    tdAttrs: { style: 'padding: 10px; vertical-align: top;' }
},
defaults: {
    xtype: 'panel',
    width: 200,
    height: 200,
    bodyPadding: 10
   },

第一段代码涉及到布局,这里大家就照抄就好,后面讲到布局的时候会解释。

第二段代码的意思是,为子组件设置默认属性。在defaults中设置了子组件的默认属性之后,在items中的子组件,就共享defaults中的属性配置。


2、FramedPanel

panel包中创建FramedPanels.js文件


代码

Ext.define('MyApp.view.panel.FramedPanels', {
    extend: 'Ext.Container',
    xtype: 'framed-panels',
    width: 660,

    layout: {
        type: 'table',
        columns: 3,
        tdAttrs: { style: 'padding: 10px; vertical-align: top;' }
    },

    defaults: {
        xtype: 'panel',
        width: 200,
        height: 280,
        bodyPadding: 10,
        frame: true
    },
   
    initComponent: function () {
        this.items = [
            {
                html:'我们都有圆角,我没有标题'
            },
            {
                title: 'Title',
                html: '我们都有圆角,我有标题'
            },
            {
                title: 'Collapsible',
                collapsible: true,
                html: '我们都有圆角,我能收缩'
            },
            {
                title: 'Tools',
                collapsible: true,
                width: 640,
                html: '我们都有圆角,我有工具栏',
                tools: [
                    { type:'pin' },
                    { type:'refresh' },
                    { type:'search' },
                    { type:'save' }
                ],
                colspan: 3
            }
        ];

        this.callParent();
    }
});

浏览器中运行项目,点击左侧树节点Framed Panel,效果图。


FramedPanels与BasicPanels代码几乎一样,只是FramedPanels中的panel多了属性frame:true,看效果图我们可以知道,frame让panel有了圆角。


3、HeaderPosition

panel包中创建HeaderPosition.js文件


代码

Ext.define('MyApp.view.panel.HeaderPosition', {
    extend: 'Ext.panel.Panel',
    xtype: 'panel-header-position',
    requires:[
        'Ext.layout.container.Column',
        'Ext.form.Label',
        'Ext.button.Segmented'
    ],
    width: 600,
    layout: 'column',
    viewModel: true,

    defaults: {
        bodyPadding: 10,
        height: 300,
        scrollable: true
    },

    initComponent: function () {

        this.bodyStyle = 'background: transparent';

        this.tbar = [
            {
                xtype: 'label',
                text: 'Header Position:'
            },
            {
                xtype: 'segmentedbutton',
                reference: 'positionBtn',
                value: 'top',
                defaultUI: 'default',
                items: [{
                    text: 'Top',
                    value: 'top'
                }, {
                    text: 'Right',
                    value: 'right'
                }, {
                    text: 'Bottom',
                    value: 'bottom'
                }, {
                    text: 'Left',
                    value: 'left'
                }]
            }
        ];

        this.items = [
            {
                columnWidth: 0.5,
                margin: '10 5 0 0',
                title: 'Panel',
                html: '我没有圆角',
                bind: {
                    headerPosition: '{positionBtn.value}'
                }
            }, {
                columnWidth: 0.5,
                margin: '10 10 10 5',
                frame: true,
                title: 'Framed Panel',
                html: '我有圆角',
                bind: {
                    headerPosition: '{positionBtn.value}'
                }
            }
        ];

        this.callParent();
    }
});

浏览器中运行项目,点击左侧树节点Header Positioning,效果图。


点击工具栏按钮时,下面两个panel的header会做相应改变。

代码中我们使用了tbar配置,这个配置的意思是为组件设置顶部工具栏。

在segmentedbutton这个组件中我们使用了一个reference配置,其在api中的解释:

reference : String

Specifies a name for this component insideits component hierarchy. This name must be unique within its view orits ViewController.See the documentation in Ext.container.Container formore information about references.

可见这个配置的作用是为组件内部结构指定一个name,之后我们就可以使用这个name来获取组件的属性值。在我们设置的两个panel中有这么一段代码

bind: {
            headerPosition: '{positionBtn.value}'
}

也就是使用了positionBtn来访问segmentedbutton属性,并绑定在panel的headerPosition配置上,控制panel header的位置。

但是, positionBtn并不能访问到全部的 segmentedbutton属性,在官方文档中有这么一段话:

“When a component is assigned a “reference” to identify it, that componentwill publish some of its key properties in the ViewModel.”

字面理解,当我们在组件中使用reference时,该组件将发布一些关键属性到ViewModel中。那么问题来了,什么是关键属性(key properties),不得而知。照我们上面的代码,我试了几个segmentedbutton的属性都访问不了。在官方文档中,讲到reference的使用时,其用到的题目是“Binding and Component State”,所以我想这些关键属性应该是能够控制组件状态的属性,例如segmentedbutton的value可以根据其items中的按钮的value来改变,再如checkbox的checked可以根据是否有勾选来改变,所以这些属性都能访问到。

 

这篇文章就讲到这里。另外Extjs5.0Demo这个项目到此就不再继续下去了,因为觉得这样导致每一篇文章都和之前的文章有联系,对一些人可能不是很方便,所以以后的文章都会用单独的项目来说明。

虽然Extjs5.0Demo不再继续下去,但是其项目架构已经很明朗了,可以以此为参考,应用于实际项目中。

最后附上到此为止的Extjs5.0Demo源码

下篇文章讲Grid组件。


交流群:170198012



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值