ExtJs 多栏工具条实现

思路:
第一种方式:先建立一个新toolbar,再render到原toolbar的父元素下。
第二种方式:自定义toolbar组件:MultiToolbar,配置参数,将原toolbar转换为多个toolbar.javascript

首先贴上参考的代码,实现第一种方式:
也可参考一下这个页面的回答:
http://stackoverflow.com/questions/829304/extjs-toolbar-with-multiple-rowscss

          var tbar1 = new Ext.Toolbar({
       splitIndexs: [
2,2], items:[ {text:'添加按钮'},{text:'修改按钮'},{text:'删除按钮'}, {text:'很长的按钮',width:200},{text:'很长的按钮',width:200},{text:'很长的按钮',width:200}, {text:'很长的按钮',width:200},{text:'很长的按钮',width:200},{text:'很长的按钮',width:200} ], }); //普通方式:new一个toolbar后,render()到已有的tbar下. var main = new Ext.Panel({ title:'一个面板', border:false, tbar : [{text:'一个按钮'},{text:'另外一个按钮'}], listeners : { 'render': function(){ //将tbar1添加到main.tbar的下面 tbar1.render(main.tbar); } } }); main.render(document.body);

而后是第二种方式:html

Ext.namespace("Ext.revenue");
/**
 * 多栏式工具条(可将过长的出现滚动条的toolbar拆成多栏)<p>
 * 
 * 参数说明:<p>
 * splitIndexs: 分割阀值,值为大于0的整数或整数数组,0或其它值将忽略。
 * 当参数为一个数组时,表示要分红n+1个toolbar,n为数组长度。<br>
 * 能够简单的理解为:该栏要几保留几个元素(包括隐藏元素),参数就填几。<br>
 * 
 * 参数值示例:<p>
 * 0,或[],或[0]    //效果同样,只有一个toolbar不分栏
 * 2或[2]    //效果同样,第一栏2个元素,剩下的分到第二栏
 * [5,6]    //第一栏5个元素,第二栏6个元素,剩下的分到第三栏
 * 4.7,[4.7]//参数将被转换为4,效果为:第一栏4个元素,剩下的分到第二栏
 * "fsdf"或-1或-232    //无效参数,将忽略,效果与普通toolbar同样。
 * 100        //数量大于toolbar的items数量,该参数将忽略。
 * [2,2,1,1,1,1,1]        //若index之和超过items数量,多余的将忽略。
 * [2,2,"q",1,1,1,1]    //"q"为非法字符,效果至关于[2,2]
 * 调用示例:<p>
 * <pre><code>
 * //从第12个元素开始分,第一栏12个元素,剩下的分到第二栏
 * new Ext.revenue.RevMultiToolbar({
 *         splitIndexs : 12, // or [12]
 *         items : [...]
 * });
 * //第一栏10个元素,第二栏12个元素,剩下的分到第三栏
 * new Ext.revenue.RevMultiToolbar({
 *         splitIndexs : [10,12],
 *         items : [...]
 * });
 * </pre></code>
 * @class Ext.revenue.RevMultiToolbar
 * @extends Ext.Toolbar
 * @author 覃熙科
 */
Ext.revenue.RevMultiToolbar = Ext.extend(Ext.Toolbar, {
        //xtype: 'toolbar',
        autoScroll:    true,
        splitIndexs : 0, // [0] 默认不分栏
        constructor : function(config){
            //统一转换为数组处理;过滤无参(没配置splitIndexs参数)的状况;
            var indexs = config.splitIndexs ? [].concat(config.splitIndexs) : [];
            //过滤非法字符;每次只取第一个数,剩下的递归。
            var index = parseInt(Ext.num(indexs[0],0),10);
            if( sliceable() ){
                //slice() 方法可从已有的数组中返回选定的元素,原数组不变.
                //将多出的部分分到新items中
                config.newItems = config.items.slice(index);
                //剩下的splitIndexs,存放起来后面递归用;
                config.newSplitIndexs = indexs.slice(1)||0;
                //splice() 方法用于插入、删除或替换数组的元素。
                //index参数值:如1表示从下标1开始分,原数组只留下[0]位置的元素。
                var howmany = config.items.length - index;//要移除多少个元素?//IE8及如下必需要此参数!!蹩脚
                config.items.splice(index,howmany);
            }
            Ext.revenue.RevMultiToolbar.superclass.constructor.call(this,config);
            //检查是否符合分割的条件
            function sliceable(){
                //参数为空,退出
                if(index<=0 || indexs.length<=0) return false;
                //若index大于等于原toolbar items的数量,退出。
                if(index >= config.items.length) return false;
                return true;
            }
        },
        listeners : {
            'render': function(thiz){
                //新toolbar渲染到原toolbar的父元素下!这样才与原toolbar平级
                var renderTo = thiz.el.parent();
                var newSplitIndexs = thiz.newSplitIndexs;
                var newItems = thiz.newItems;

                //排除没有newItems的状况
                if(!newItems) return ;
                createToolbar();
                function createToolbar(){
                    //此时再用newItems组建新toolbar
                    var newToolbar = new Ext.revenue.RevMultiToolbar({
                        autoScroll: true,
                        renderTo: renderTo,
                        splitIndexs: newSplitIndexs,
                        items: newItems
                    });
                }
        //删除newItems,避免重复render
        delete newItems;
        delete newSplitIndexs;
            }
        }
});

//调用示例
var tbar1 = new Ext.revenue.RevMultiToolbar({
  splitIndexs: [2,2],
  items:[
    {text:'添加按钮'},{text:'修改按钮'},{text:'删除按钮'},
    {text:'很长的按钮',width:200},{text:'很长的按钮',width:200},{text:'很长的按钮',width:200},
    {text:'很长的按钮',width:200},{text:'很长的按钮',width:200},{text:'很长的按钮',width:200}
  ]
});java

完整代码:数组

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
    <title> </title>
    <meta charset="utf-8">
    <link href="../ext-3.2/resources/css/ext-all.css" type="text/css" rel="stylesheet">
    <script type="text/javascript" src="../ext-3.2/adapter/ext/ext-base-debug.js"></script>
    <script type="text/javascript" src="../ext-3.2/ext-all-debug.js"></script>
    <script src="../ext-3.2/build/ext-lang-zh_CN.js" type="text/javascript"></script>
 
 </head>

 <body>
    <script type="text/javascript">
        Ext.QuickTips.init();
        Ext.onReady(function(){
            Ext.namespace("Ext.revenue");
            /**
             * 多栏式工具条(可将过长的出现滚动条的toolbar拆成多栏)<p>
             * 
             * 参数说明:<p>
             * splitIndexs: 分割阀值,值为大于0的整数或整数数组,0或其它值将忽略。
             * 当参数为一个数组时,表示要分红n+1个toolbar,n为数组长度。<br>
             * 能够简单的理解为:该栏要几保留几个元素(包括隐藏元素),参数就填几。<br>
             * 
             * 参数值示例:<p>
             * 0,或[],或[0]    //效果同样,只有一个toolbar不分栏
             * 2或[2]    //效果同样,第一栏2个元素,剩下的分到第二栏
             * [5,6]    //第一栏5个元素,第二栏6个元素,剩下的分到第三栏
             * 4.7,[4.7]//参数将被转换为4,效果为:第一栏4个元素,剩下的分到第二栏
             * "fsdf"或-1或-232    //无效参数,将忽略,效果与普通toolbar同样。
             * 100        //数量大于toolbar的items数量,该参数将忽略。
             * [2,2,1,1,1,1,1]        //若index之和超过items数量,多余的将忽略。
             * [2,2,"q",1,1,1,1]    //"q"为非法字符,效果至关于[2,2]
             * 调用示例:<p>
             * <pre><code>
             * //从第12个元素开始分,第一栏12个元素,剩下的分到第二栏
             * new Ext.revenue.RevMultiToolbar({
             *         splitIndexs : 12, // or [12]
             *         items : [...]
             * });
             * //第一栏10个元素,第二栏12个元素,剩下的分到第三栏
             * new Ext.revenue.RevMultiToolbar({
             *         splitIndexs : [10,12],
             *         items : [...]
             * });
             * </pre></code>
             * @class Ext.revenue.RevMultiToolbar
             * @extends Ext.Toolbar
             * @author 覃熙科
             */
            Ext.revenue.RevMultiToolbar = Ext.extend(Ext.Toolbar, {
                    //xtype: 'toolbar',
                    autoScroll:    true,
                    splitIndexs : 0, // [0] 默认不分栏
                    constructor : function(config){
                        //统一转换为数组处理;过滤无参(没配置splitIndexs参数)的状况;
                        var indexs = config.splitIndexs ? [].concat(config.splitIndexs) : [];
                        //过滤非法字符;每次只取第一个数,剩下的递归。
                        var index = parseInt(Ext.num(indexs[0],0),10);
                        if( sliceable() ){
                            //slice() 方法可从已有的数组中返回选定的元素,原数组不变.
                            //将多出的部分分到新items中
                            config.newItems = config.items.slice(index);
                            //剩下的splitIndexs,存放起来后面递归用;
                            config.newSplitIndexs = indexs.slice(1)||0;
                            //splice() 方法用于插入、删除或替换数组的元素。
                            //index参数值:如1表示从下标1开始分,原数组只留下[0]位置的元素。
                            var howmany = config.items.length - index;//要移除多少个元素?//IE8及如下必需要此参数!!蹩脚
                            config.items.splice(index,howmany);
                        }
                        Ext.revenue.RevMultiToolbar.superclass.constructor.call(this,config);
                        //检查是否符合分割的条件
                        function sliceable(){
                            //参数为空,退出
                            if(index<=0 || indexs.length<=0) return false;
                            //若index大于等于原toolbar items的数量,退出。
                            if(index >= config.items.length) return false;
                            return true;
                        }
                    },
                    listeners : {
                        'render': function(thiz){
                            //新toolbar渲染到原toolbar的父元素下!这样才与原toolbar平级
                            var renderTo = thiz.el.parent();
                            var newSplitIndexs = thiz.newSplitIndexs;
                            var newItems = thiz.newItems;

                            //排除没有newItems的状况
                            if(!newItems) return ;
                            createToolbar();
                            function createToolbar(){
                                //此时再用newItems组建新toolbar
                                var newToolbar = new Ext.revenue.RevMultiToolbar({
                                    autoScroll: true,
                                    renderTo: renderTo,
                                    splitIndexs: newSplitIndexs,
                                    items: newItems
                                });
                            }
                            //删除newItems,避免重复render
                            delete newItems;
                            delete newSplitIndexs;
                        }
                    }
            });

            //调用示例
            //var tbar1 = new Ext.Toolbar({
            var tbar1 = new Ext.revenue.RevMultiToolbar({
                splitIndexs: [3,3,1,1,1,1],
                items:[
                    {text:'添加按钮'},{text:'修改按钮'},{text:'删除按钮'},
                    {text:'很长的按钮',width:200},{text:'很长的按钮',width:200},{text:'很长的按钮',width:200},
                    {text:'很长的按钮',width:200},{text:'很长的按钮',width:200},{text:'很长的按钮',width:200}
                ]
            });
            //普通方式:new一个toolbar后,render()到已有的tbar下.
            var main = new Ext.Panel({
                title:'一个面板',
                border:false,
                tbar : [{text:'一个按钮'},{text:'另外一个按钮'}],
                listeners : {
                    'render': function(){
                        //将tbar1添加到main.tbar的下面
                        tbar1.render(main.tbar);
                    }
                }
            });
            main.render(document.body);
        });
    </script>
 </body>
</html>
View Code

 

效果预览(第一个工具栏请忽略):ide

未分栏前:

使用splitIndexs : 3分栏后:

使用splitIndexs : [3,3]分栏后:

使用splitIndexs : [3,3,1,1]分栏后:

使用splitIndexs : [3,3,1,1,1,1]分栏后:其实后面的参数超了,会忽略掉和上面[3,3,1,1]效果是同样的。
工具