【问题标题】:How can I implement extjs nested border layout?如何实现 extjs 嵌套边框布局?
【发布时间】:2013-11-11 17:55:02
【问题描述】:

我正在开发一个具有 5 个面板的应用程序。我想使用layout:'border' 以便我可以利用split:true 配置。想象一个有 5 行的表格,每行都可以调整大小并代表一个面板。

例子:

frame: false,
width: 700,
border: false,
height: 600,
stateful: false,
layout: 'fit',
items: 
{
    layout: 'border',
    items:
    [
        {
            region: 'north',
            split: true,
            minWidth: 350,
            border: false,
            frame: false,
            layout: 'fit',
            title:'NNNNN',           
            margins: '0 0 0 0',
            items: []
        },
        {
            region: 'center',
            split: true,
            minWidth: 350,
            border: false,
            frame: false,
            layout: 'fit',
            title:'AAAAA',           
            margins: '0 0 0 0',
            items: 
            {
                layout: 'border',
                items:
                [
                    {
                        region: 'north',
                        .......
                    },
                    {
                        region: 'center',
                        .......
                    },
                    {
                        region: 'south',
                        ..........
                    }
                ]
            }
        },
        {
            region: 'south',
            split: true,
            minWidth: 350,
            border: false,
            frame: false,
            layout: 'fit',
            title:'CCCCCCCC',           
            margins: '0 0 0 0',
            items: []             
        }
    ]
} 

我也在考虑使用Resizer,但这里还有另一个问题。这是我在 ExtJs 3.4 中使用的类,它正在工作:

Ext.define('myapp.ResizablePanel', 
{
    extend         : 'Ext.panel.Panel',
    alias          : 'widget.reszpanel',

    handles        : 's',

    resizePanel: function()
    {
        this.syncSize();       
        this.updateLayout();
        if (this.layout) 
            this.doLayout(true, true);
    },

    onRender:function() 
    {
        this.callParent(arguments);

        this.resizer = new Ext.Resizable
        ({
            el: this.getEl(),
            handles: this.handles,
            minHeight: 120,
            maxHeight: 20000
        }).on("resize", this.resizePanel.bind(this));
    }
});

这很有帮助,而不是 xtype: 'panel',我使用的是 xtype: 'reszpanel',并且在我将代码更新到 ExtJS 4.2 之前一切正常。现在 this.syncSize() 函数在组件中不存在,我不知道哪个较新的函数可以做到这一点。这是尝试使用边框布局实现的方式。

问题是,当我只有一个北、东、西、南和中心时,一切都很好。但是当我尝试嵌套布局时,代码会中断。有什么帮助吗?谢谢

【问题讨论】:

    标签: extjs extjs4 border-layout


    【解决方案1】:

    您可以拥有多个区域为“北”的面板,您只需要确保只有一个中心面板。嵌套面板不利于性能,因此您应该尽可能避免这种情况。

    {
        xtype: 'container',
        layout: 'border',
        items: [{
            xtype: 'panel',
            region: 'north',
            title: 'North 1',
            split: true
        },{
            xtype: 'panel',
            region: 'north',
            title: 'North 2',
            split: true
        },{
            xtype: 'panel',
            region: 'north',
            title: 'North 3',
            split: true
        },{
            xtype: 'panel',
            region: 'center',
            title: 'Center'
        }]
    }
    

    另请参阅文档中border layout 上的注释。

    【讨论】:

    • 好的,但问题是现在它消失了,最后一个面板超出了屏幕高度。你知道如何强制它添加滚动条以便所有面板都可见吗?
    • 问题是,根据文档,中心面板将始终具有灵活的高度,试图适应容器的高度:Any child items with a region of north or south may be configured with either an initial height, or a Ext.layout.container.Box.flex value, or an initial percentage height string (Which is simply divided by 100 and used as a flex value). The 'center' region has a flex value of 1. 您可以尝试使用 @ 创建一个空的中心面板987654324@ 并且只使用北面板。您可能还必须在容器上设置autoScroll: true
    • 你知道最大的问题是什么吗?假设我有高度为 200 的北面板,在该面板中,将渲染一个高度 > 200 的网格。问题是我希望在这种情况下网格具有自动滚动功能,但是如果我调整面板的大小,网格也会调整大小可能直到它的最大高度
    • 再次,尽量避免嵌套面板。网格面板派生自常规面板,因此它继承了其行为。你不能只在网格上设置region: north 而不是嵌套它吗?
    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 2012-02-24
    • 2011-07-30
    • 1970-01-01
    • 2011-01-29
    • 2013-10-02
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多