Extjs 3根据数据库动态生成checkboxgroup(extjs系列1)

1.需求:

开发的过程中遇到了根据数据库字段来构造checkbox的需求,在baidu上面搜了很多结果一看都是千篇一律转载过来的,不能直接使用,但是可以借鉴的,由于开发的组件用到了extjs。我也刚开始用,所以弄了两天,还好把这个需求弄出来了。方法也许不好,但是可以使用大笑

2.准备组件:

额外用到了ext的ajax同步请求的组件,因为异步的话checkboxgroup还未构建就调用会报错,当然开始就赋几个item应该不会报错了,我也没时间来验证了,干脆弄了同步的。

同步组件是ext-basex.js网上很多的。csdn上面有下载。

3.开发步骤:

Ext.namespace('My.UI');

 My.UI.CheckboxGroup=Ext.extend(Ext.form.CheckboxGroup,{

    columns:6,

    dataUrl:'', //数据地址

    labelFiled:'columnChName',

    valueFiled:'columnName',

    setValue:function(val){

        if(val.split){

            val=val.split(',');

        }

        this.reset();

        for(var i=0;i<val.length;i++){

            this.items.each(function(c){

                //debugger;



                if(c.inputValue==val[i]){

                    c.setValue(true);

                }

            });

        }

        

    },

    reset:function(){

        this.items.each(function(c){

            c.setValue(false);

        });

    },

    

    getValue:function(){

        var val=[];

        this.items.each(function(c){

            if(c.getValue()==true)

                val.push(c.inputValue);

        });

        return val.join(',');

    },

    onRender:function(ct, position){ 

       var items=[];

       //alert(items.length);

        if(!this.items){ //如果没有指定就从URL获取

           Ext.Ajax.request({

                url:this.dataUrl,

                scope:this,

                async:false,

                success:function(response){

                    var data = Ext.util.JSON.decode(response.responseText);

                    

                    data=data.rows||data;

                    

                    var Items2=this.items;

                     

                     if(this.panel)

                     {

                     

                         var columns=this.panel.items;

                     

                     

                         if(columns)

                         {

                            for(var i=0;i<columns.items.length;i++){

                                column=columns.items[i];

                                column.removeAll();

                            }

                            Items2.clear();

                         }

                     }

                 

                     for(var i=0;i<data.length;i++){

                            var d=data[i];

                            var chk = {boxLabel: d[this.labelFiled], name: this.name, inputValue: d[this.valueFiled],tooltip:'sssf'};

                            

                            //alert(d[this.labelFiled]);

                            items.push(chk);

                            //alert(items.length);

                     } 

                      

                      

                }

                

            });

           this.items=items;

        }

        My.UI.CheckboxGroup.superclass.onRender.call(this, ct, position);

    }

});

Ext.reg('mycheckgroup',My.UI.CheckboxGroup);

其中async:false, 的意思是同步的意思。

接着是调用的代码,这里把我所有代码都拷贝过来了,自己摘抄着看

Ext.onReady(function(){



    Ext.QuickTips.init();

    

    // turn on validation errors beside the field globally

    Ext.form.Field.prototype.msgTarget = 'side';

    /*====================================================================

     * CheckGroup example

     *====================================================================*/

    var cc=new My.UI.CheckboxGroup({

    //fieldLabel: 'Auto Layout',

    name: 'temCheckedgroup', 

    dataUrl: '${pageContext.request.contextPath}/cashway/DetailSearch_getkdpjnlTableInfo.do'

     });

    

    var checkGroup = {

        xtype: 'fieldset',

        title: '请选择查询条件',

        autoHeight: true,

        layout: 'form',

        //collapsed: true,   // initially collapse the group

        //collapsible: true,

        items: [cc]

    };

    

    var sp = new Ext.FormPanel({

       url:'${pageContext.request.contextPath}/cashway/DetailSearch_next.do',

       standardSubmit: true,

       renderTo:'form-cthid',

    });

    

    // combine all that into one huge form

    var fp = new Ext.FormPanel({

        

        frame: true,

        labelWidth: 10,

        url:'${pageContext.request.contextPath}/cashway/DetailSearch_next.do',

        renderTo:'form-ct',

        bodyStyle: 'padding:0 10px 0;',

        items: [

            

            checkGroup

            

        ],

        buttons: [{

            text: '下一步',

            handler: function(){

            //var fp = this.ownerCt.ownerCt,

                form = fp.getForm();

                sform = sp.getForm();

            if (form.isValid()) {

                // check if there are baseParams and if

                // hiddent items have been added already

                if (sp.baseParams && !sp.paramsAdded) {

                    // add hidden items for all baseParams

                    for (i in sp.baseParams) {

                       //alert(i);

                        sp.add({

                            xtype: 'hidden',

                            name: i,

                            value: fp.baseParams[i]

                        });

                    }

                    sp.doLayout();

                    // set a custom flag to prevent re-adding

                    sp.paramsAdded = true;

                }

                for(var ik =0;ik<cc.items.length;ik++)

                {

                   if(cc.items.itemAt(ik).checked)

                   {

                       var stuId = new Ext.form.TextField({

                                    

                                    name:'checkeditem',

                                    value:cc.items.itemAt(ik).inputValue,

                                    readOnly:true

                                    });

                    sp.add(stuId);

                   }

                }

                //alert(cc.items.itemAt(0).inputValue);

                form.submit();

            }

               //if(fp.getForm().isValid()){

               //     Ext.Msg.alert('Submitted Values', 'The following will be sent to the server: <br />'+ 

               //         fp.getForm().getValues(true).replace(/&/g,', '));

                

                //}

                //showPopupDetailWindow();

            }

        },{

            text: '重置',

            handler: function(){

                fp.getForm().reset();

            }

        }]

    });

});

强调一下sp那个form是没用了,我对struts不是太熟悉,提交的时候我开始想的是构建一个form然后把所有选中的项添加到form中去然后提交,后来发现checkboxgroup是只提交选中的项,所以直接submit原来的那个form就可以了。

后台获取:

注意这个checkboxgroup的name是name: 'temCheckedgroup', 没有i开头是后面action里面的属性如果是i开头的话会出问题(我没研究过,遇到了)。

后台代码:

private String[] temCheckedgroup;

有get set方法即可,这样提交的时候会自动的装配值,因为name都是相同的,所以自动装配成数组形式。

开发.net习惯了,struts还是很不适应 呵呵,弄了两天。ext虽然强大,但是我还没开始喜欢。

你可能感兴趣的:(checkbox)