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刚刚入门写的不好,有用到的希望对你有帮助。

原文地址:https://www.cnblogs.com/soief/p/2380502.html