ExtJS入门教程02,form也可以很优雅

简介:

在上一篇《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绑定到界面中:

image

前面提到,通过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);
    }
});

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

image

界面超难看,试试用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"
        }
    ]
}

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

image

接下来我们演示一个较为复杂的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来组织字段,效果如下:

image

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

这篇文章还发布在了我的个人网站上面,链接地址:http://www.qeefee.com/article/extjs-starter-02-form

如果认为此文对您有帮助,别忘了支持一下哦!

作者: 齐飞
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

转载:http://www.cnblogs.com/youring2/p/extjs-starter-02-form.html
目录
相关文章
|
存储 Linux Docker
Docker 更新版本
Docker 更新版本原来版本 1.10 更新后的版本 19.03.1 更新 Docker 版本需要注意的问题: 注意系统是否支持新版本的储存驱动。 19.03.01 版本默认使用的储存驱动是 overlay2。
3182 0
|
8月前
|
Python
课时20:集合的运算
本内容介绍集合的运算,涵盖交集、并集、差集、异或集及子集等概念。通过Python代码示例详细说明各运算符(如 &、|、-、^、<=、<、>=、>)的使用方法,并解释其在实际编程中的应用。重点在于理解集合运算的基本原理及其在编程中的实现,帮助读者掌握集合运算的基础知识。
|
10月前
|
供应链 数据挖掘 API
1688app 商品详情接口系列(1688API)
1688作为国内知名批发采购平台,提供了一系列商品详情接口(API),助力企业和开发者获取商品基础、价格、库存及供应商信息。通过Python示例代码展示如何调用这些接口,应用场景涵盖采购决策辅助、数据分析与市场调研、电商平台整合及供应链管理系统的优化,为企业和采购商提供有力的数据支持,提升业务效率和竞争力。
366 15
|
网络协议 算法 网络架构
|
JavaScript Java Go
sonar 使用常见问题总结
Sonar 是一个开源平台,用于管理源代码质量的工具。Sonar 不只是一个质量数据报告工具,更是代码质量管理的平台。它支持非常多的语言,包括常见的 Java、PHP、C#、C、Golang、JS等。在安装部署和使用的过程会经常遇到各种问题,今天简单梳理一下自己遇到的几个问题。
1733 0
sonar 使用常见问题总结
|
存储 缓存 网络安全
DVC 使用指南:项目结构中.dvc文件详解
您可以使用 dvc add 来跟踪位于当前工作空间中的数据文件或目录。 此外,dvc import 和 dvc import-url 允许您将数据从外部的位置带到您的项目,并开始在本地跟踪它。 以 .dvc 扩展名结尾的文件由这些命令创建为可以使用 Git 进行版本控制的数据占位符。 它们包含随时跟踪目标数据所需的信息。
|
SQL 存储 NoSQL
基于 MySQL + Tablestore 分层存储架构的大规模订单系统实践-SQL 查询和分析
前言前面我们介绍了基于 MySQL + Tablestore 分层架构的订单系统。订单数据储存进入 Tablestore 后,用户可以使用 SDK 中的 API 访问数据,也可以继续使用 SQL 访问 Tablestore 中的数据。Tablestore 提供了多种 SQL 的接入方式,客户可以通过 DLA 访问 Tablestore,也可以利用 Tablestore 自身对 SQL 的支持能力,
1221 0
基于 MySQL + Tablestore 分层存储架构的大规模订单系统实践-SQL 查询和分析
|
人工智能 算法 Cloud Native
独家下载!《AI开发者的Docker实践》
本文档主要面向算法开发同学,从0基础实现将代码打包docker镜像-调试-提交仓库-提交云服务训练模型/天池大赛提交/学校服务器训练 等流程。也同样适用于初次接触docker的同学,帮助大家快速上手大赛提交和远程服务器训练。
25620 0
独家下载!《AI开发者的Docker实践》
|
NoSQL 测试技术 Docker
K8S从懵圈到熟练:读懂这一篇,集群节点不下线
排查完全陌生的问题,完全不熟悉的系统组件,是售后工程师的一大工作乐趣,当然也是挑战。今天借这篇文章,跟大家分析一例这样的问题。排查过程中,需要理解一些自己完全陌生的组件,比如systemd和dbus。
9256 0