在上一篇《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. 使用DataAnnotations实现数据验证

    https://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.aspx http://www.cnblo ...

  2. nodejs 针对 mysql 设计的原型库,支持事务/共享多次/单次查询

    //通过this访问内置流程对象, 在每个流程中都能使用 //this.conn => mysql-connection //this.results => 整个流程数已经返回的值 //t ...

  3. android实现点击背景图片不同区域实现不同事件

    有时候我们拿到一张背景图片,客户要求点击图片的不同区域去跳转或者实现不同的操作事件.我们首先要确认图片的点击区域,往往我们会在布局文件那里下手,但是这样不好做适配,所以我实现了以下方法,基本功能可以实 ...

  4. C++ c++初识

    //c++初识 #include<iostream> //包含c++标准头文件 //<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上, ...

  5. Windows下MemCache多端口安装配置

    Windows下MemCache环境安装配置的文章很多,但大部分都是用的默认端口11211,如何修改默认端口.如何在一台服务器上配置多个MemCache端口?这正式本文要解决的问题. 1.从微软官网下 ...

  6. Gradle tip #2: understanding syntax

    In the Part 1 we talked about tasks and different stages of the build lifecycle. But after I publish ...

  7. initWithNibName&initWithCoder &awakeFromNib&UIView常见属性方法

    第一.initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. 第 二.initWithCoder 是一个类在IB中创建 ...

  8. 编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

    前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正. 建议1. ...

  9. ios-遍历和排序

    // // main.m // OC-遍历和排序-homework // // Created by dllo on 16/2/25. // Copyright © 2016年 dllo. All r ...

  10. 每天一个linux命令(16):whereis 命令

    whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和 find相比,whereis查找的速度 ...