ExtJS 4.2 业务开发(三)数据添加和修改

接上面的船舶管理业务,这里介绍添加和修改操作。

目录

1. 添加操作

2. 修改操作

3. 在线演示

1. 添加操作

1.1 创建AddShipWindow.js

在业务中的view目录下创建一个AddShipWindow.js文件,表示一个增加船舶的窗口组件。

此文件中包含了一个form组件用于显示所要添加的字段:船舶名称、状态、吨数和核载人数。

具体代码如下

Ext.define(‘App.ShipMgr.view.AddShipWindow‘, {
    extend: ‘Ext.window.Window‘,
    layout: ‘fit‘,
    constrain: true, // 是否只能在父容器的范围内拖动
    modal: true, // 是否有遮挡层
    width: 340,
    requires: [‘App.ShipMgr.model.ShipModel‘],
    initComponent: function () {
        var me = this;
        var _oprType = me.oprType || ‘add‘; // 类型;eg:add(添加)、edit(修改)
        var _shipId = me.shipId; // 船舶Id
        var _url = me.url; // 各操作的url,如:add、edit的url
        var _successCallback = me.successCallback || ‘‘; // 成功执行的回调

        // 【form】
        var shipForm = Ext.create(‘Ext.form.Panel‘, {
            defaultType: ‘hiddenfield‘,
            width: ‘100%‘,
            bodyPadding: 5,
            autoScroll: true,
            url: _url,
            fieldDefaults: {
                labelAlign: ‘right‘,
                labelWidth: 75,
                width: 275
            },
            items: [
                Ext.create(‘Ext.form.field.Text‘, {
                    fieldLabel: ‘船舶名称‘,
                    name: ‘ShipName‘,
                    maxLength: 50,
                    allowBlank: false,
                    afterLabelTextTpl: ‘<span style="position: absolute;margin-left: 210px;color: red;line-height: 2;" >*<span>‘
                }),
                Ext.create(‘Ext.form.field.ComboBox‘, {
                    fieldLabel: ‘状态‘,
                    name: ‘State‘,
                    emptyText: ‘请选择船舶状态‘,
                    editable: false,
                    allowBlank: false,
                    valueField: ‘State‘,
                    displayField: ‘StateName‘,
                    queryMode: ‘remote‘,
                    triggerAction: ‘all‘,
                    afterLabelTextTpl: ‘<span style="position: absolute;margin-left: 210px;color: red;line-height: 2;" >*<span>‘,
                    store: Ext.create(‘Ext.data.Store‘, {
                        fields: [‘State‘, ‘StateName‘],
                        data : [
                            { ‘State‘: ‘online‘, ‘StateName‘: ‘在线‘ },
                            { ‘State‘: ‘offline‘, ‘StateName‘: ‘离线‘ },
                        ]
                    })
                }),
                Ext.create(‘Ext.form.field.Number‘, {
                    fieldLabel: ‘吨位‘,
                    name: ‘Tonnage‘,
                    allowBlank: false,
                    maxValue: 10000,
                    minValue:1,
                    decimalPrecision: 1,
                    afterLabelTextTpl: ‘<span style="position: absolute;margin-left: 210px;color: red;line-height: 2;" >*<span>‘
                }),
                Ext.create(‘Ext.form.field.Number‘, {
                    fieldLabel: ‘核载人数‘,
                    name: ‘LoadNumber‘,
                    allowBlank: false,
                    maxValue: 10000,
                    minValue: 1,
                    decimalPrecision: 1,
                    afterLabelTextTpl: ‘<span style="position: absolute;margin-left: 210px;color: red;line-height: 2;" >*<span>‘
                }),
                { name: ‘ShipId‘, value: _shipId },
            ],
            buttons: [
            {
                text: ‘提交‘,
                name: ‘SubmitBtn‘,
                handler: function () {
                    if (!shipForm.getForm().isValid()) { return; }
                    me.setLoading(true);
                    shipForm.getForm().submit(
                        {
                            clientValidation: true,
                            submitEmptyText: false,
                            success: function (thisControl, action) {
                                var rs = Ext.JSON.decode(action.response.responseText);
                                me.setLoading(false);
                                me.close();
                                if (_successCallback) { // 回调
                                    _successCallback();
                                }
                            },
                            failure: function (thisControl, action) {
                                var rs = Ext.JSON.decode(action.response.responseText);
                                if (rs.msg) {
                                    Ext.Msg.alert(‘系统提示‘, rs.msg);
                                } else {
                                    Ext.Msg.alert(‘系统提示‘, ‘操作失败!‘);
                                }
                                me.setLoading(false);
                            }
                        }
                    );
                }
            }, {
                text: ‘取消‘,
                name: ‘CancelBtn‘,
                handler: function () {
                    me.close();
                }
            }]
        });

        // 填充窗口
        Ext.applyIf(me, {
            items: [shipForm]
        });

        me.callParent(arguments);
    }
});

1.2 入口设置

在上一篇的grid工具栏中加入【添加】按钮:

Ext.create(‘Ext.Action‘, {
    icon: ‘Resources/icon/add.png‘,
    text: ‘添加‘,
    name: ‘AddBtn‘,
    handler: function (thisControl, event) {
        var winConfig = {
            title: ‘添加船舶‘,
            oprType: ‘add‘,
            url: ‘Business/ShipMgr/Add‘,
            successCallback: function () {
                shipMgrStore.loadPage(1); // 添加成功后刷新Store
            }
        };
        var win = Ext.create(‘App.ShipMgr.view.AddShipWindow‘, winConfig);
        Ext.getCmp(‘app_tabContainer‘).activeTab.add(win);
        win.show();
    }
})

1.3 运行图

2. 修改操作

2.1 修改窗口

船舶业务的修改窗口可以跟添加窗口公用一个,需要在弹出窗口时判断为添加操作还是别的操作。

若非添加操作,如:查看、修改时,加载本次请求的船舶信息并填充到具体的form表单里。

在AddShipWindow.js文件里添加如下代码:

// 渲染结束后
me.on(‘afterrender‘, function () {
    // 1.非添加操作,查询具体的船舶
    if (_oprType != ‘add‘) {
        me.setLoading(true);
        Ext.Ajax.request({
            method: ‘POST‘,
            type: ‘ajax‘,
            url: ‘Business/ShipMgr/QueryById‘,
            params: {
                shipId: _shipId
            },
            success: function (response) {
                var rs = Ext.JSON.decode(response.responseText);
                if (rs.success == false) { //操作失败
                    Ext.Msg.alert(‘系统提示‘, rs.msg);
                }
                else {
                    var en = Ext.create(‘App.ShipMgr.model.ShipModel‘, rs.data);
                     // 填充数据
                     shipForm.loadRecord(en);
                }
                me.setLoading(false);
            },
            failure: function (response, opts) {
                me.setLoading(false);
                Ext.Msg.alert(‘系统提示‘, ‘操作失败‘);
            }
        });
    }
});

  

2.2 入口设置

【修改】按钮比较特殊,在默认情况是隐藏状态,只有选中了grid组件中的一条记录才显示出来。

2.2.1 创建按钮

在上一篇的grid工具栏中加入【修改】按钮:

Ext.create(‘Ext.Action‘, {
    icon: ‘Resources/icon/edit.png‘,
    text: ‘修改‘,
    name: ‘EditBtn‘,
    hidden:true,
    handler: function (thisControl, event) {
        var winConfig = {
            title: ‘修改船舶‘,
            oprType: ‘edit‘,
            url: ‘Business/ShipMgr/Update‘,
            shipId:selectData.ShipId,
            successCallback: function () {
                shipMgrStore.reload(); // 修改成功后刷新Store
            }
        };
        var win = Ext.create(‘App.ShipMgr.view.AddShipWindow‘, winConfig);
        Ext.getCmp(‘app_tabContainer‘).activeTab.add(win);
        win.show();
    }
})

2.2.2 隐藏按钮

每次shipMgrStore发起请求时都要隐藏【修改】按钮:

var shipMgrStore = Ext.create(‘Ext.data.Store‘, {
    // ...
    listeners: {
        beforeload: function (thisStore, record, opts) {
            thisStore.proxy.extraParams = searchConditionObj; // 附加检索条件
            shipMgrToolBarPanel.down(‘[name=EditBtn]‘).hide(); // 隐藏【修改】按钮
        }
    }
});

2.2.3 显示按钮

选中shipMgrGrid的某条数据时显示按钮:

var shipMgrGrid = Ext.create(‘Ext.grid.Panel‘, {
    // ...
    listeners: {
        cellclick: function (thisGridView, td, cellIndex, record, tr, rowIndex, e, eOpts) {
            selectData = record.data; // 获取选中的数据
            shipMgrToolBarPanel.down(‘[name=EditBtn]‘).show(); // 显示【修改】按钮
        }
    }
});

2.3 运行图

3. 在线演示

在线演示http://www.akmsg.com/ExtJS/index.html#App.ShipMgr.ShipMgrTab

==================================系列文章==========================================

本篇文章:7.7  ExtJS 4.2 业务开发(三)数据添加和修改

Web开发之路系列文章

时间: 2024-12-15 07:16:20

ExtJS 4.2 业务开发(三)数据添加和修改的相关文章

ExtJS 4.2 业务开发(二)数据展示和查询

本篇开始模拟一个船舶管理系统,提供查询.添加.修改船舶的功能,这里介绍其中的数据展示和查询功能. 目录 1. 数据展示 2. 数据查询 3. 在线演示 1. 数据展示 在这里我们将模拟一个船舶管理系统,并提供查询.添加.修改的功能. 大致的目录结构如下: ShipMgrTab.js :船舶业务的入口. controller 目录:存放船舶业务的逻辑控制文件. model 目录:存放船舶业务的model文件. store 目录 :存放船舶业务的store文件. view 目录 :存放船舶业务的组件

ExtJS 4.2 业务开发(一)主页搭建

本篇开始搭建一个ExtJS 4.2单页面应用, 这里先介绍主页的搭建,内容包括:主页结构说明.扩展功能等方面. 目录 1. 主页结构说明 2. 扩展功能 3. 在线演示地址 1. 主页结构说明 1.1 主页布局 传统的ExtJS 4.2应用,基本布局如下: 1.2 主页布局分析 根据上面的主页布局图,可转换具体试图结构: header:存放系统的名称.logo.用户信息等内容. menu:菜单区域,以Tree形态展现业务入口. tab:业务区域,具体的业务都以tab页的形式嵌入到此区域. 1.3

微服务业务开发三个难题-拆分、事务、查询(上)

微服务架构变得越来越流行了.它是模块化的一种方法.它把一整块应用拆分成一个个服务.它让团队在开发大型复杂的应用时更快地交付出高质量的软件.团队成员们可以轻松地接受到新技术,因为他们可以使用最新且推荐的技术栈来实现各自的服务.微服务架构也通过让每个服务都被部署在最佳状态的硬件上而改善了应用的扩展性. 但微服务不是万能的.特别是在 领域模型.事务以及查询这几个地方,似乎总是不能适应拆分.或者说这几块也是微服务需要专门处理的地方,相对于过去的单体架构. 在这篇文章中,我会描述一种开发微服务的方法,这个

微服务业务开发三个难题-拆分、事务、查询(下)

上集我们阐述了使用微服务体系架构的关键障碍是领域模型,事务和查询,这三个障碍似乎和功能拆分具有天然的对抗.只要功能拆分了,就涉及这三个难题. 然后我们向你展示了一种解决方案就是将每个服务的业务逻辑实现为一组DDD聚合.然后每个事务只能更新或创建一个单独的聚合.然后通过事件来维护聚合(和服务)之间的数据一致性. 在本集中,我们将会向你介绍使用事件的时候遇到了一个新的问题,就是怎么样通过原子方式更新聚合和发布事件.然后会展示如何使用事件源来解决这个问题,事件源是一种以事件为中心的业务逻辑设计和持久化

【SQL Server 2008 R2 Reporting Services 报表开发】数据表存储格式修改。

Format属性:日期:输入d(表示简易日期).2007/5/1 0:00:00   输入d之后 变成 2007/5/1 金额:输入C0(表示货币),系统会根据设定值产生对应的货币符号,至于0则表示保留小数0位.36,216 输入C0之后变成  数量:输入N0,表示呈现数值0位小数,也就是没有小数位. 参考书籍<SQL Server 2008 R2  Reporting Services 报表服务  中国水利水电出版社 尹湘志 胡百敬 著>

iOS开发系列--数据存取

概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列—Objective-C之Foundation框架的文章中提到归档.plist文件存储,包括偏好设置其本质都是存储为文件,只是说归档或者plist文件存储可以选择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的Library/Preferences目录.当然,文件存储并不作为本文的重点内容.本文重点还是说数据库存储,做过数据库开发的朋友应该知道,可以通过SQL直接访问数据库,也可以

MVC5 网站开发之八 栏目功能 添加、修改和删除

本次实现栏目的浏览.添加.修改和删除. 栏目一共有三种类型. 常规栏目-可以添加子栏目,也可以添加内容模型.当不选择内容模型时,不能添加内容. 单页栏目-栏目只有一个页面,可以设置视图. 链接栏目-栏目为一个链接,点击后转到相应链接. 在视图中原本栏目的树形显示插件使用Bootstrap TreeView 1.2.0(MVC5 网站开发之六 管理员 2.添加.删除.重置密码.修改密码.列表浏览),后来使用中发现zTree使用起来更习惯,所以更换成zTree了. 目录 MVC5网站开发之一 总体概

安卓开发_数据存储技术_sqlite

一.SQLite SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了.SQLite已经被多种软件和产品使用 二.SQLite特性 1 2 1.轻量级 3 SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器.使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能.而且那个动态库的尺寸也相当小. 4 2.独立性 5 SQLite数据库的核心引擎本身

业务层和数据层

业务层和数据层父类及接口-T4模板 在上一篇中,我们已经把项目的基本框架搭起来了,这一篇我们就来实现业务层和数据层的父接口及父类. 1.我们先来定义一个业务层父接口IBaseBLL.cs using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;using System.Text;using System.Threading.Tasks; namespace IBLL