`
清风_夕瑶
  • 浏览: 53813 次
  • 性别: Icon_minigender_1
  • 来自: 潘多拉星球
社区版块
存档分类
最新评论

ext组件化编程(grid与form数据交互)

    博客分类:
  • js
阅读更多

    好久没用ext了,工作中要用到,想想这次用组件化编程方式吧。因为,之前的写法太垃圾了。个人认为组件化的好处是,相对降低对象的生命周期,其它方面的暂时没考虑到——没好好学过js,就学用框架。当然,回顾还是看别人的代码。一番寻找,找到了dojochina的一个例子。

    该实例实现了grid与form间的数据交互,所有数据均为临时存储。代码如下:

/**
 * 扩展验证
 */
Ext.apply(Ext.form.VTypes, {
    'age':function(_v){
    if(/^\d+$/.test(_v))
    {
     var _age = parseInt(_v);
    
     if(_age < 200)
      return true;
    }
   },
   'ageText':'该选项必须输入,例如:24',
   'ageMask':/[0-9]/i
 });
/**
 * 定义form
 */
 PersonInfoFormPanel = Ext.extend(Ext.form.FormPanel, {
     constructor: function(){
         PersonInfoFormPanel.superclass.constructor.apply(this, [{
             baseCls: "x-plain",
             buttonAlign: "right",
             labelWidth:30 ,
             defaultType: "textfield",
             defaults: {
                 anchor: "95%"
                 //labelStyle: "text-align:right"//设定后文本框和标签占据同一区域
             },
             items: [{
                 fieldLabel: "姓名",
                 name: "name"
             }, {
                 fieldLabel: "年龄",
                 name: "age",
                 vtype: "age"//验证年龄(通过vtype类型来验证)
             }, {
                 xtype: "combo",
                 mode: "local",//本地数据
                 readOnly: true,
                 fieldLabel: "性别",
                 displayField: "sex",//显示下拉框的内容
                 triggerAction: "all",//在选择时,显示所有的项
                 value: "男",//默认值
                 store: new Ext.data.SimpleStore({
                     fields: ["sex"],
                     data: [["男"], ["女"]]
                 }),
                 name: "sex"//绑定字段
             }]
         
         
         }])
     },
     //---以下为PersonInfoFormPanel类对外提供的方法---
     getValues: function(){
         if (this.getForm().isValid()) 
             return new Ext.data.Record(this.getForm().getValues());
         else 
             throw new Error("验证没有通过");//自定义异常
     },
     setValues: function(_r){
         this.getForm().loadRecord(_r);
     },
     reset: function(){
         this.getForm().reset();
     }
     
     
 });
/**
 * 定义window
 */
 baseWindow = Ext.extend(Ext.Window, {
     form: null,
     constructor: function(){
         this.form = new PersonInfoFormPanel();//实例化PersonInfoFormPanel类
         baseWindow.superclass.constructor.apply(this, [{
             modal: true,
             resizable: false,
         	 plain: true,
         	 width:350,
	         items:this.form,
	         buttonAlign:'right',
	         closeAction:'hide',
	         bodyStyle:{'padding':'10px 0 10px 10px'},
             items: this.form,
             buttons: [{
                 text: "确 定",
                 handler:this.onSubmitClick,//提交事件调用
                 scope: this
             }, {
                 text: "取 消",
                 handler:this.onCancelClick,//取消事件调用
                 scope: this
             
             }]
         }]);
         //给insertWindow对象添加事件(事件冒泡)
         this.addEvents("submit");
     },
    //提交事件处理函数
    onSubmitClick: function(){
        try {
            //发布事件
            this.fireEvent("submit", this, this.form.getValues());//调用PersonInfoFormPanel类中自定义的方法getValues
            this.close();
            
        } 
        catch (_err) {
            Ext.Msg.alert("系统提示", _err.description);//扑捉自定义错误或异常
        }
    },
    //取消事件处理函数
    onCancelClick: function(){
        this.close();
    },
    //重置与隐藏事件处理函数
    close: function(){
        this.form.reset();
        this.hide();
    }
    
});
/**
 * 增加人员窗口
 */
insertWindow = Ext.extend(baseWindow, {
    title: "新增人员"
});
/**
 * 修改人员窗口
 */
updateWindow = Ext.extend(baseWindow, {
    title: "修改人员",
    load: function(_r){
        this.form.setValues(_r);
    }
});
/**
 * 人员列表
 */
PersonListGridPanel = Ext.extend(Ext.grid.GridPanel, {
    _window: null,
    _updateWin: null,
    constructor: function(_url){
        this._window = new insertWindow();//insertWindow对象引用
        this._updateWin = new updateWindow();//updateWindow对象引用
        PersonListGridPanel.superclass.constructor.apply(this, [{
            renderTo: Ext.getBody(),
            width:325 ,
            height:200 ,
            frame: true,
            autoScroll:true,
            layout: "form",
            //工具栏
            tbar: [{
                text: "添加人员",
                handler: function(){
                    this._window.show();
                },
                scope: this
            }, "-", {
                text: "修改人员",
                handler: function(){
                    this._updateWin.show();
                    try {
                        this._updateWin.load(this.getSelected());
                    } 
                    
                    
                    catch (_err) {
                        Ext.Msg.alert("系统提示", _err.description);
                        this._updateWin.close();
                    }
                },
                scope: this
            }, "-", {
                text: "删除",
                handler: this.onRemovePerson,
                scope: this
            }],
            enableColumnMove: false,
            //列模板
            columns: [{
                header: "姓名",
                menuDisabled: true,
                dataIndex: "name"
            }, {
                header: "年龄",
                menuDisabled: true,
                dataIndex: "age"
            }, {
                header: "性别",
                menuDisabled: true,
                dataIndex: "sex"
            }],
            //内存数据
           store: new Ext.data.Store({
	         proxy: new Ext.data.MemoryProxy([['张三','24','男'],['李四','23','女'],['王五','25','男'],['赵六','27','女'],['木易','26','男']]),
	         reader:new Ext.data.ArrayReader({},['name','age','sex']),
	         autoLoad:true
	        }),
            /*store: new Ext.data.JsonStore({
                autoLoad: true,
                url: _url,
                fields: ["name", "age", "sex"]
            }),*/
            //选中模板
            selModel: new Ext.grid.RowSelectionModel({
                singleSelect: true,
                listeners: {
                    "rowselect": {
                        fn: this.onRowSelected,
                        scope: this
                    }
                }
            })
        
        }]);
        //添加事件
        this.addEvents("rowselect");
        //事件订阅
        this._window.on("submit", this.onInsertWinSubmit, this);
        this._updateWin.on("submit", this.onUpdateWinSubmit, this);
    },
    //----- 以下为自定义方法---------
    //获得选中的记录
    getSelected: function(){
        var _sm = this.getSelectionModel();
        if (_sm.getCount() == 0) 
            throw new Error("你没有选中任何记录,请选择一条记录后重试");
        return _sm.getSelected();
    },
    //插入一条记录
    insert: function(_r){
        this.getStore().add(_r);
    },
    //更新选中的记录
    update: function(_r){
        try {
            var _rs = this.getSelected();
            var _data = _rs.data;
            for (var _i in _data) {
                _rs.set(_i, _r.get(_i));
            };
            _rs.commit();
        } 
        catch (_err) {
        
        }
        
    },
    //删除选中的记录
    remove: function(){
        try {
            var _rs = this.getSelected();
            Ext.Msg.confirm("系统提示", "你确定删除吗?", function(_btn){
                if (_btn == "yes") 
                    this.getStore().remove(_rs);
            }, this);
        } 
        catch (_err) {
            Ext.Msg.alert("系统提示", _err.description);
        }
    },
    //-------以下为自定义事件处理函数------------
    //添加事件
    onInsertWinSubmit: function(_win, _r){
        this.insert(_r);
    },
    //修改事件
    onUpdateWinSubmit: function(_win, _r){
        this.update(_r);
    },
    //删除事件
    onRemovePerson: function(){
        this.remove();
    },
    //选中事件
    onRowSelected: function(_sel, _index, _r){
        this.fireEvent("rowselect", _r);//发布事件
    }
    
})

 

分享到:
评论

相关推荐

    EXT中文手册 Grid Form

    首先需要定义数据源,然后配置列模型,最后实例化Grid组件,并启用分页工具栏。 #### 使用Ajax EXT通过Ajax技术实现了客户端与服务器端的无刷新数据交换,提高了用户体验。 **PHP** 在PHP环境下,可以通过配置...

    EXT2.0 GRID 示例

    EXT2.0是EXT库的一个早期版本,它提供了丰富的用户界面组件,包括GRID,用于展示大量结构化数据。 EXT2.0 GRID组件是EXT库中的核心部分,它允许开发者以表格形式显示数据,并提供了一系列功能,如排序、分页、筛选...

    EXT制作的FORM,可以与Servlet进行交互

    综上所述,EXT form与Servlet的交互是一个涉及前端和后端协同的过程,利用EXT的组件化和AJAX特性,可以创建出交互性强、用户体验良好的Web应用。同时,EXT提供的丰富配置和定制选项使得开发者能够根据需求进行精细的...

    使用Ext的Grid,Form,Dialog来实现分页列表,创建,修改,删除功能

    总的来说,通过组合使用Ext的Grid、Form和Dialog组件,开发者可以构建出功能完善的Web应用,实现数据的展示、编辑和管理。这些组件提供了丰富的API和灵活性,使得开发复杂用户界面变得相对简单。理解并熟练运用这些...

    Ext组件描述,各个组件含义

    ### Ext组件概述与详解 #### 一、Ext基础组件 **1.1 Box Component (Ext.BoxComponent)** - **xtype**: `box` - **功能描述**:Box Component 是一个非常基本的 Ext 组件,主要用于定义具有边框和其他布局属性的...

    EXT组件初学者教程 grid+tree+window+描述文档

    - 文件"EXT组件grid+tree+window.docx"很可能包含了EXTJS组件的具体实现代码,以及代码中的关键属性和方法解释,帮助初学者理解组件的工作原理和配置方式。 - "role"和"rolePermission"可能是示例中的数据模型或者...

    ext 编程开发指南

    除了以上提到的MessageBox和Grid之外,EXT还提供了大量的其他组件,如Form、TabPanel、Tree等,满足多样化的用户界面需求。 #### 使用Ajax Ajax是现代Web应用不可或缺的一部分,它使得页面可以在不重新加载的情况...

    Ext自定义Grid Cell插件

    在Ext JS这个强大的JavaScript框架中,`Grid...在深入研究`Ext Grid CellEdit`的过程中,了解和掌握组件化开发思想、事件处理机制以及数据绑定原理是非常重要的,这些知识点能够帮助你更好地驾驭此类自定义插件的开发。

    ext form gridpanel

    "Ext Form GridPanel"是Ext JS库中的一个重要组件,它结合了表格(Grid)和表单(Form)的功能,提供了一种强大而灵活的方式来显示和编辑数据。在Web应用程序开发中,这种组件常用于数据录入和展示,尤其适用于处理...

    Ext3.2源码、API、及Demo(grid例子)

    通过查阅API,开发者可以迅速了解如何创建组件、配置属性、监听事件以及与其他EXT组件交互。例如,EXT的GridPanel组件,它用于展示二维数据,并支持排序、分页和行操作,API中会详细解释如何创建GridPanel,配置...

    ExtGrid使用

    2. **ExtGrid**:ExtGrid是Ext JS中的表格组件,用于显示结构化的数据。它支持多种功能,如排序、过滤、分页、行编辑等。在本例中,开发者创建了一个具有这些特性的ExtGrid实例。 3. **数据展示**:在ExtGrid中,...

    ext可视化编辑工具

    EXT可视化编辑工具是一种高效、便捷的网页开发利器,旨在提升编程人员的开发效率,与知名的Dreamweaver类似。它提供了一种所见即所得(WYSIWYG)的界面,使得开发者无需深入HTML、CSS和JavaScript的底层细节,就能...

    Ext.Store的获取方法

    然而,获取`Ext.Store`的方式并不像获取其他Ext组件那样直接,因为Store并不是一个具有可视界面的组件,它是一个纯粹的数据容器。 在传统的创建`Ext.Store`的方法中,我们通常会这样定义一个Store: ```javascript...

    EXT4.3实现动态表单全动态

    - **组件化设计**:EXT4.3中的表单基于组件模型,可以方便地创建、添加、删除和修改表单字段。通过`Ext.form.FieldSet`和`Ext.container.Container`等类,开发者可以构建复杂的动态表单结构。 - **动态生成**:...

    ext 打造华丽页面

    Grid支持排序、分页、行选择等多种功能,可以轻松地与各种数据源进行交互。EXT Form则是用于创建用户输入表单的工具,它提供了各种表单字段类型,并支持验证,使用户输入的数据更规范。 EXT JS的事件处理系统也是其...

    ext-date.rar_ext da_ext date

    在实际应用中,开发者可能需要将EXT Date与其他EXT组件(如Grid、Form等)结合,实现日期输入、日期显示、日期检索等功能,以提升应用程序的交互性和实用性。 在压缩包"ext-date"中,可能包含了EXT Date控件的源码...

    Ext与后台数据库交互

    `Ext.data`是Ext框架的核心模块之一,它主要负责封装与数据相关的各种操作。该模块下包括了多个子类,例如`Ext.data.Store`、`Ext.data.DataProxy`以及`Ext.data.DataReader`等,这些子类共同协作完成数据的加载、...

    Ext日期时间控件 Spinner控件 Ext代码 Extjs Grid

    当我们谈论`ExtJS Grid`时,我们指的是一个强大的数据展示组件,它可以显示大量结构化的数据,并提供排序、分页、过滤等功能。在`Grid`中集成日期时间控件和Spinner控件,可以使用户直接在表格单元格内进行日期和...

    Ext2.0组件,全组件和帮助手册

    Ext2.0包含了一系列的UI组件,如面板(Panel)、表格(Grid)、表单(Form)、菜单(Menu)、按钮(Button)、工具栏(Toolbar)、树形视图(Tree)等。这些组件都具有高度可配置性和可扩展性,能够满足各种复杂的...

    EXT grid 表头 三层 插件

    EXT Grid 是一个强大的数据网格组件,广泛应用于EXT JS框架中,用于展示和操作大量结构化数据。表头的三层插件则是EXT Grid的一种扩展功能,它允许用户在表头部分实现更为复杂和多层次的布局,以更好地管理和组织...

Global site tag (gtag.js) - Google Analytics