首页 > 代码库 > ExtJs之表单(form)

ExtJs之表单(form)

--Form和Form Basic

Extjs Form和Form Basic是两个东西,Form提供界面的展示,而Form Basic则提供数据的处理、验证等功能。每一个Form Panel在创建的时候,都会绑定一个Form Basic,我们可以通过方法getForm来获取:

form.getForm()

在API方面,Form的config中没有显示Form Basic的config,但是Form Basic的config在Form的config中完全有效,也就是说,当我们使用Extjs Form的时候,不仅仅要查看Form的API文档,还要浏览相关的Form Basic的文档。
创建Extjs Form控件

var form = Ext.create("Ext.form.Panel", {
    width: 500,
    height: 300,
    margin: 20,
    title: "Form",
    renderTo: Ext.getBody(),
    collapsible: true,  //可折叠
    autoScroll: true,   //自动创建滚动条
    defaultType: ‘textfield‘,
    defaults: {
        anchor: ‘100%‘,
    },
    fieldDefaults: {
        labelWidth: 80,
        labelAlign: "left",
        flex: 1,
        margin: 5
    },
    items: [
        {
            xtype: "container",
            layout: "hbox",
            items: [
                { xtype: "textfield", name: "name", fieldLabel: "姓名", allowBlank: false },
                { xtype: "numberfield", name: "age", fieldLabel: "年龄", decimalPrecision: 0, vtype: "age" }
            ]
        },
        {
            xtype: "container",
            layout: "hbox",
            items: [
                { xtype: "textfield", name: "phone", fieldLabel: "电话", allowBlank: false, emptyText: "电话或手机号码" },
                { xtype: "textfield", name: "phone", fieldLabel: "邮箱", allowBlank: false, emptyText: "Email地址", vtype: "email" }
            ]
        },
        {
            xtype: "textareafield",
            name: "remark",
            fieldLabel: "备注",
            height: 50
        }
    ],
    buttons: [
        { xtype: "button", text: "保存" }
    ]
});


--Extjs Form布局

在Extjs Form中,默认的布局方式是layout: ‘anchor‘
anchor默认每行只显示一个控件,如果我们要在一行中显示多个,需要将这些控件放在一个container中,并设置container的layout为hbox。

--Extjs Form加载数据

Form可以加载Model数据,也可以加载Json数据,这样我们可以方便的将json或者record数据显示在Extjs Form控件中。
加载Record数据

Extjs Form通过方法loadRecord加载record,代码如下:

var userRecord = Ext.create("MyApp.model.User", {
    name: "Tom",
    age: 25,
    phone: "123456"
});

form.loadRecord(userRecord);

加载Json数据

Extjs Form可以通过调用formbasic的setValues方法来加载json数据,代码如下:

var data = http://www.mamicode.com/{
    name: "Tom",
    age: 25,
    phone: "123456"
};
form.getForm().setValues(data);

--Extjs Form获取与更新数据

通过上面的方法,我们可以为Form加载record或json数据。当我们完成编辑之后,还需要获取编辑后的数据,或者将编辑后的数据更新到对应的record中,Extjs Form提供了相应的方法来完成这些操作。

如果Extjs Form加载的是record:

form.updateRecord();

如果Extjs Form加载的是json数据:

form.getForm().getValues()

Extjs Form异步加载与提交

Extjs Form除了可以加载页面中已存在的数据外,还可以通过Ajax的方式异步加载与提交数据。这种方法不太常用。
异步加载

form.getForm().load({
    url: "form-data.ashx"
});

服务器返回的数据格式如下:

{
    success:true,
    data:{
        name: "Tom",
        age: 25,
        phone: "123456"
    }
}

异步提交

form.submit({
    url: "form-submit.ashx",
    success: function (form, action) {
        Ext.Msg.alert(‘Success‘, action.result.msg);
    }
});

submit方法提交的数据为Form中的所有value,可以在服务器端获取到。


--Extjs Form验证

在所有开发语言中,客户端验证是必不可少的。Extjs Form也提供了客户端验证机制,我们可以通过vtype来实现客户端验证。接下来我们详细的了解一下Extjs的客户端验证。
必填项,就是不能为空(allowBlank)

不为空
{
    xtype: "textfield",
    name: "UserName",
    fieldLabel: "用户名",
    allowBlank: false,
    flex: 1
}

长度限制
{
    xtype: "textfield",
    name: "UserName",
    fieldLabel: "用户名",
    allowBlank: false,
    maxLength: 10,
    minLength: 3,
    flex: 1
}

邮箱
{
    xtype: "textfield",
    name: "Email",
    fieldLabel: "Email",
    vtype: "email",
    flex: 1
}

自定义xtype
//验证ip地址
Ext.apply(Ext.form.field.VTypes, {
    IPAddress: function (v) {
        return /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(v);
    },
    IPAddressText: ‘只能输入ip地址‘,
    IPAddressMask: /[\d\.]/i
});
{
    xtype: "textfield",
    name: "ip",
    fieldLabel: "IP地址",
    vtype: "IPAddress"
}


补充--Ext之DOM

Ext.Element(几乎对DOM的一切进行了彻底的封装)
1.Ext.get(Ext.Element.get)  使用了缓存机制来提升获取DOM节点的效率  返回的是Ext.Element()
首先去缓存找  如果缓存里有  直接返回即可;  如果缓存里没有  那再去页面上查找  
如果页面没有  返回null   如果页面里有  把当前内容加入到缓存里
var d1 = Ext.get(‘d1‘);
alert(d1.dom.innerHTML);

2.Ext.fly(Ext.Element.fly)  使用了经典的享元模式 从而节约内存  更加低碳化
返回的是Fly对象   可以理解为 Ext.Element对象
var d2 = Ext.get(‘d2‘);
var d3 = Ext.get(‘d3‘);//由于使用了享元模式 只适合一次操作  从而节省内存
d2.dom.innerHTML = ‘AAA‘;
d3.dom.innerHTML = ‘BBB‘;

3.Ext.getDom()  直接返回HTMLElement元素

Ext.DomHelper(他是一个强大的操作UI界面的工具类)
Ext..DomQuery(用来进行DOM节点的查询)

ExtJs之表单(form)