在上一篇《Extjs window 入门》中,我们已经看到了如何将一个form组件放到window中,今天我们来看看form的一些优雅的工作方式。

使用fieldDefaults,优雅的设置字段默认值

form中的子项,通常都是field控件,而这些field控件通常都会使用一些相同的配置,例如labelWidth、labelAlign等,如果在每一个field中设置这些属性就会显得比较繁琐,这个时候我们就需要用到fieldDefaults配置项:

{
xtype: "form",
bodyPadding: 5,
border: false,
fieldDefaults: {
labelWidth: 50,
labelAlign: "right"
},
items: [
{
xtype: "textfield",
fieldLabel: "姓名",
name: "UserName"
},
{
xtype: "textarea",
fieldLabel: "留言",
name: "Comment"
}
]
}

使用load()方法,优雅的加载数据

向form中绑定数据的方法有好几种,我们先来看看如何通过异步的方式从服务器来获取数据的:

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

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

{
success:true,
data:{
UserName:'QeeFee',
Comment:'齐飞是个程序员'
}
}

这个时候我们的form就会自动将data中的UserName和Comment绑定到界面中:

前面提到,通过ajax异步加载是众多加载方式中的一种,这时候小伙伴开始问了,那么其他的加载方式呢?

其他还有两种,是用来加载本地(内存)数据的,例如我们已经存在了一个data数据:

var data = {
UserName: 'QeeFee',
Comment: '齐飞是个程序员'
};

我们要把这个data绑定到form中,该怎么做呢?看下面的代码:

win.down("form").getForm().setValues(data);

一样的效果,不再截图了。

接下来是第三种方式,加载record数据。首先,我们的record是需要先定义model的,不了解model是什么的朋友请移步>>ExtJS 4.2 教程-04:数据模型

首先定义一个数据模型:

Ext.define("CommentModel", {
extend: "Ext.data.Model",
fields: [
{ name: "UserName", type: "string" },
{ name: "Comment", type: "string" }
]
});

有了模型以后,我们需要来创建一个模型的对象:

var comment = Ext.create("CommentModel", {
UserName: 'QeeFee',
Comment: '齐飞是个程序员'
});

接下来我们就该完成绑定了:

win.down("form").getForm().loadRecord(comment);

这个时候是不是有些怕麻烦的小伙伴已经开始抱怨了,这么麻烦啊……

其实不是这个样子的,麻烦自然有麻烦的道理。使用这种绑定方法,我们可以方便的更新模型对象的数据:

win.down("form").updateRecord();
var record = win.down("form").getRecord();
Ext.MessageBox.alert("提示", record.get("UserName"));

看到了吧小伙伴,我们可以使用form逆向的更新record,是不是方便了很多呢?

使用submit()方法,优雅的提交数据

submit()方法和load()方法的用法非常相似,我们可以通过submit方法非常方便的将form表单数据提交到服务器:

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

我们来跟踪一下服务器接收到的数据:

界面超难看,试试用layout来组织界面

小伙伴看看我们上面的form界面,右侧空出很大一片,是不是很丑?

可能你会觉得为form和field加上width属性,问题自然就解决了,但是如果我们改变了window的宽度呢?仍然去修改form和field吗?

小伙伴们,是时候使用layout了!

关于extjs的layout,不明白的小伙伴可以参考我之前的文章>>ExtJS 4.2 教程-08:布局系统详解

接下来我们为window和form添加上布局配置:

{
xtype: "form",
bodyPadding: 5,
border: false,
layout: "form",
fieldDefaults: {
labelWidth: 50,
labelAlign: "right"
},
items: [
{
xtype: "textfield",
fieldLabel: "姓名",
name: "UserName"
},
{
xtype: "textarea",
fieldLabel: "留言",
name: "Comment"
}
]
}

再次打开窗口,看看是不是好了很多:

接下来我们演示一个较为复杂的form:

Ext.onReady(function () {
var win = Ext.create("Ext.Window", {
title: "complex form",
width: 500,
height: 300,
layout: "fit",
items: {
xtype: "form",
bodyPadding:5,
border: false,
layout: "form",
fieldDefaults: {
labelWidth: 60,
labelAlign: "right"
},
items: [
{
xtype: "fieldcontainer",
layout: "hbox",
items: [
{ xtype: "textfield", name: "UserName", fieldLabel: "用户名", flex: 1 },
{ xtype: "textfield", name: "Age", fieldLabel: "年龄", flex: 1 }
]
},
{
xtype: "fieldcontainer",
layout: "hbox",
items: [
{ xtype: "textfield", name: "TelPhone", fieldLabel: "电话", flex: 1 },
{ xtype: "textfield", name: "Email", fieldLabel: "Email", flex: 1 }
]
},
{
xtype: "textarea",
fieldLabel: "备注"
}
]
},
buttons: [
{ text: "保存" },
{ text: "取消" }
]
});
win.show();
});

这是一个稍微复杂一点的form,它用到了fieldcontainer来组织字段,效果如下:

小伙伴们,我决定把form的验证放到明天的文章中进行介绍,请原谅我偷懒。谢谢各位!

ExtJS入门教程02,form也可以很优雅的更多相关文章

  1. 无废话ExtJs 入门教程二十一[继承:Extend]

    无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...

  2. 无废话ExtJs 入门教程十七[列表:GridPanel]

    无废话ExtJs 入门教程十七[列表:GridPanel] extjs技术交流,欢迎加群(201926085) 在Extjs中,GridPanel用于数据显示,即我们平时说的列表页.在本节中,我们先对 ...

  3. 无废话ExtJs 入门教程十六[页面布局:Layout]

    无废话ExtJs 入门教程十六[页面布局:Layout] extjs技术交流,欢迎加群(201926085) 首先解释什么是布局: 来自百度词典的官方解释:◎ 布局 bùjú: [distributi ...

  4. 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]

    无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...

  5. 无废话ExtJs 入门教程十四[文本编辑器:Editor]

    无废话ExtJs 入门教程十四[文本编辑器:Editor] extjs技术交流,欢迎加群(201926085) ExtJs自带的编辑器没有图片上传的功能,大部分时候能够满足我们的需要. 但有时候这个功 ...

  6. 无废话ExtJs 入门教程十三[上传图片:File]

    无废话ExtJs 入门教程十三[上传图片:File] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...

  7. 无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two]

    无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two] extjs技术交流,欢迎加群(201926085) 不管是几级下拉列表的联动实现本质上都是根据某个下拉列表的变化,去动态加载其 ...

  8. 无废话ExtJs 入门教程十一[下拉列表:Combobox]

    无废话ExtJs 入门教程十一[下拉列表:Combobox] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个一个下拉列表: 1.代码如下: 1 <!DOCT ...

  9. 无废话ExtJs 入门教程十[单选组:RadioGroup、复选组:CheckBoxGroup]

    无废话ExtJs 入门教程十[单选组:RadioGroup.复选组:CheckBoxGroup] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个一个单选组,一个复 ...

随机推荐

  1. zepto的tap事件的穿透分析

    首先是什么情况下会发生zepto(tap)的事件穿透: 当一个弹出层用tap点击之后这个层隐藏或者是移走,都会触发下面对应位置的点击事件(click)和一些标签的默认行为(a标签的跳转.input获取 ...

  2. C语言 详解多级指针与指针类型的关系

    //V推论①:指针变量的步长只与‘指针变量的值’的类型有关(指针的值的类型 == 指针指向数据的类型) //指针类型跟指针的值有关,指针是占据4个字节大小的内存空间,但是指针的类型却是各不相同的 // ...

  3. benchmark

    redis benchmark How many requests per second can I get out of Redis? Using New Relic to Understand R ...

  4. JavaScript及其异步实现

    由于javascript本身是单线程模型,这里主要通过Callbacks,Listeners,Control Flow Libraries ,Promises四种方式来实现异步操作. Referenc ...

  5. Android 获取手机Mac地址,手机名称

    /** * 获取手机mac地址<br/> * 错误返回12个0 */ public static String getMacAddress(Context context) { // 获取 ...

  6. Jenkins进阶系列之——11修改Jenkins用户的密码

    说明:本方法仅适用于jdk6+.tomcat6+和Jenkins专有用户数据库的Jenkins! 很多童鞋在使用jenkins的时候忘记密码了,然后各种蛋疼.最近闲着无事,折腾了下.好了,闲话少扯. ...

  7. BASE64Decoder 编码(sun.jar)

    Base64 是网络上最常见的用于传输8Bit 字节代码的编码方式之一,大家可以查看RFC2045 -RFC2049 ,上面有MIME 的详细规范.  Base64 要求把每三个8Bit 的字节转换为

  8. 【niubi-job——一个分布式的任务调度框架】----框架设计原理以及实现

    引言 niubi-job的框架设计是非常简单实用的一套设计,去掉了很多其它调度框架中,锦上添花但并非必须的组件,例如MQ消息通讯组件(kafka等).它的框架设计核心思想是,让每一个jar包可以相对之 ...

  9. 记录nginx 搭建集群环境踏过的坑

    因为生产环境做了负载均衡,为了尽可能跟线上环境一致,所以想在本地也搭集群,这样测试更靠谱.首先就想到nginx 这货,搭个简单的web 服务器实在太简单了. nginx 这玩意11年简单玩过,那是版本 ...

  10. mongo里面根据对象字段的ID查询 db.Photo.find({'owner.$id':ObjectId('xxxx')}) , 并且使用forEach循环修改查询的数据

    var ones = db.Photo.find({'owner.$id':ObjectId("5344f0dab7c58e8e098b4567")}) db.Photo.find ...