Extjs 3,jstl根据数据库数据自动构建FormPanel(Extjs系列2)

1.业务需要动态生成表单,根据表字段生成相应的textfield

2.这里实例是struts实现的,标签语言是jstl.

3.java操作略去,从前端开始

4.思路:

        1.直接拼凑form里面的item布局字符串,然后json.decode就行了

        2.一行一行的生成控件然后加入进去。重新layout一下

5.代码:

Ext.onReady(function(){



    Ext.QuickTips.init();

       <c:set var="interArr" value="${fn:length(checklist)}"></c:set> //jstl标签,取得控件的总个数

       <c:set var="checkArr" value="${checklist}"></c:set>//是一个list对象,里面是自定义的table对象,包含表名称、字段名称、字段类型、中文字段名称

        var i=${interArr};//获取记录数

       

//下面代码是实现四列的布局代码,主要是什么时候加入元素结束符,很简单看看就明白了

        var n = Math.round(i/4)==0?1:Math.round(i/4);

        var c = i<4?i:4;

        var str ="[";

        var k=0;

        <c:forEach items="${checkArr}" var="chitem">

        

          if(k%4==0)

          {

             str +='{'+

           "layout: 'column',"+

           "border:false,"+

           "items: [";

          }

          

          str+= "{layout:'form',columnWidth:.25,items:[{xtype:'${chitem.xtype}',";

          str+= "fieldLabel: '${chitem.columnChName}',";

          str+= "name: '${chitem.columnName}',";

          str+= "anchor:'95%'";

          str+= "}]}";

          if(k!=i-1&&k%4!=3)

          {

            str+=",";

          }

          if((k%4==3)||(k==i-1))

          {

             str += "]}" 

             if(k!=i-1)

             str+=",";

          }

          k++;

          

        </c:forEach>

        //alert(str);

        //document.getElementById("te").value= str;

        str+="]";

        var itemsstr = Ext.util.JSON.decode(str); //json的decode转换成控件

//字符串拼凑完毕

        //document.getElementById("dd").value=str;

      

    // turn on validation errors beside the field globally

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

   

    var fp = new Ext.form.FormPanel({

        renderTo: 'docbody',

        //title   : 'Composite Fields',

        autoHeight: true,

        //width   : 600,

        frame:true,

        bodyStyle: 'padding: 5px',

        layout: 'form',

        labelWidth:100,

        autoHeight: true,

        autoWidth : true,

        defaults: {

            anchor: '0'

        },

        

        items : [

        itemsstr

        ]

        ,

        buttons: [{

            text: '下一步',

            handler: function(){

            //var fp = this.ownerCt.ownerCt,

                form = fp.getForm();

                

            if (form.isValid()) {

                

            }

            }

        },{

            text: '重置',

            handler: function(){

                fp.getForm().reset();

            }

        }]

        });

//完成了,下面的代码是实验的代码没有用



        fp.doLayout();

      //下面是手动创建行的示例,网上找的,我试了试可行,这种方法应该更好,我上面的方法不细心的话容易出错。

         var pnRow2=new Ext.Panel({  

        layout:'column',  

        border:false,  

        items:[  

            new Ext.Panel({  

                columnWidth:.5,  

                layout:'form',  

                border:false,  

                labelWidth:40,  

                labelAlign:'right',  

                items:[  

                    {  

                        xtype:'datefield',  

                        name:'birthday',  

                        fieldLabel:'生日',  

                        anchor:'95%'  

                    }  

                ]  

            }),  

            new Ext.Panel({  

                columnWidth:.5,  

                layout:'form',  

                border:false,  

                labelWidth:40,  

                labelAlign:'right',  

                items:[  

                    {  

                        xtype:'combo',  

                        name:'study',  

                        store:['专科','本科','硕士','博士'],  

                        fieldLabel:'学历',  

                        anchor:'95%'  

                    }  

                ]  

            })  

        ]  

    });

    

    //var ddss= new Array

    //fp.add(pnRow2);  

    //fp.doLayout();

});

这样就可以了,网上找了很多资料,但是很少有跟我需求一样的,其中有个问题很奇怪:

<c:set var="checkArr" value="${checklist}"></c:set>

我这样${checklist[0].xtype}就可以

但是这样:

int j=0;

${checklist[j].xtype}这样就不行 很奇怪,所以最后用的foreach语句。

补充说明一下:

str+= "{layout:'form',columnWidth:.25,items:[{xtype:'${chitem.xtype}',"; str+= "fieldLabel: '${chitem.columnChName}',"; str+= "name: '${chitem.columnName}',"; str+= "anchor:'95%'";

这里就是读取对象属性的,columnName,xtype这些都是我定义对象的属性名称。

extjs刚刚入门写的不好,有用到的希望对你有帮助。

你可能感兴趣的:(FormPanel)