`

ExtJS中FormPanel实现数据加载和提交

阅读更多

在使用使用FormPanel时我们通常需要使用它的form对象来加载数据或提交数据。FormPanel中的 form对象为Ext.form.BasicForm类型的对象,它有load和submit方法分别用于加载数据和提交数据。而这两个方法都是通过调用 Ext.form.BasicForm中的doAction方法来操作的。doAction方法带有两个参数,其中第二个参数为从load或submit 方法传递过来的Ext.form.Action对象的配置数据(Config Options)。其中的success和failure属性是用于处理请求成功或失败的函数。但需要注意的是,文档中的说明是这个success或 failure取决于Http请求过程是否出错。实际情况却并非这样,我在开发过程中发现HTTP响应代码一直都是200,但被调用的函数却一直都是 failure属性对应的函数。通过查看Action.js可以发现响应过来的数据是需要符合一定格式的,Ext.form.Action.Load的 API文档开头就说明了响应数据包必须类似下面的格式:

{
    success: true,
    data: {
        clientName: "Fred. Olsen Lines",
        portOfLoading: "FXT",
        portOfDischarge: "OSL"
    }
}

这个说明在我使用ExtJS的时候再次误导了我。我认为只需要响应的数据为类似的格式就可以了。结果仍然出错,查看Action.js中的 handleResponse方法可以看出,返回的数据为上面代码的格式,但并不是说从服务端发送过来的数据就是这样的格式,而是需要将 Ext.form.Action.Load的result属性设置成上面的格式的数据。从handleResponse也可以看出,Action.js使用了form.reader属性来处理服务端数据。这个属性也可以在初始化FormPanel的时候传递给FormPanelFormPanel将会把这个属性传递给它内置的BasicForm对象。怎样使用JsonReader来使提取响应数据来使它满足PanelForm的要求呢?再看 handleResponse中的代码,在reader存在的情况下,它返回的是所需要的格式的数据,一个包含success属性和data属性的对象,而data属性来自于JsonReader的read方法处理后的结果。再查看JsonReader.js中的read方法,它调用的是 readRecords来读取数据,而返回的值是由reader的root属性决定的,从JsonReader.js中还可以看出,root属性对应的 JSON对象必须是集合类型的,因此我们在后台发送过来的数据必须也是集合类型,我在这里也出了错。一直认为加载数据到Form里,一次只加载一条,所以从服务端传递过来的数据都是单个的对象,而将JsonReader对象的root设置为单个对象的名称,结果Form中一直都加载不上数据。后来将服务端传递过来的数据修改为集合数型问题解决了。

小结:

  1. ExtJS中JsonReader对于数据的处理总是一致的,不管你需要的是单条记录还是多条记录,它总是通过total属性判断记录数,通过root属性对应的名称来取记录集合。
  2. FormPanel中处理数据的为内置的BasicForm类型的对象,它通过load和submit方法来加载或提交数据。而这两个方法是通过 Ext.form.Action的两个子类Ext.form.Action.Load、Ext.form.Action.Submit来提交请求和调用用户的success和failure方法。决定调用success和failure的并非Http请求是否出错,而是决定于Action.js中 handleResponse的处理结果。我们可以通过设置FormPanel的reader配置对象来干预handleResponse对数据的处理。而这个reader也可设置响应数据与FormPanel中字段的对应关系。
  3. 多看源码,可以获取更多。

附:

表格中双击进行编辑的JS源码,这个代码比官方文档中的处理方式简单一些,觉得官方文档中的edit中加载数据的处理是一种hack的方式,并不太适合实际应用。

ExtJS网站上的CRUD的文章,其中包含有加载数据进行编辑的例子

Ext.onReady(function(){
var newFormWin;
var form1;

    //表格处理
    //Ext.BLANK_IMAGE_URL = 'extjs/resources/images/default/s.gif';
    Ext.QuickTips.init();
    var sm = new Ext.grid.CheckboxSelectionModel(); //CheckBox选择列

    var cm = new Ext.grid.ColumnModel([
        new Ext.grid.RowNumberer(), //行号列
        sm,
        {header:'编号',dataIndex:'id'},
        {header:'性别',dataIndex:'sex',renderer:function(value){
            if(value=='1'){
                return "男";
            }else{
                return "女";
            }
        }}, //增加性别,自定义renderer,即显示的样式,可以加html代码,来显示图片等。
        {header:'名称',dataIndex:'name'},
        {header:'描述',dataIndex:'memo'}
    ]);

    var ds = new Ext.data.Store({
        proxy: new Ext.data.HttpProxy({url:ACTION_URL}),//调用的动作
        reader: new Ext.data.JsonReader({
            totalProperty: 'total',
            root: 'list',
            successProperty :'success'
        },
                                        [{name: 'id',mapping:'id',type:'string'},
                                         {name: 'sex',mapping:'sex',type:'string'},
                                         {name: 'name',mapping:'name',type:'string'},
                                         {name: 'memo',mapping:'memo',type:'string'} //列的映射
                                        ])
    });


    var grid = new Ext.grid.GridPanel({
        id: 'grid',
        el: 'center',
        region:'center',
        title:'用户',
        ds: ds,
        sm: sm,
        cm: cm,
        bbar: new Ext.PagingToolbar({
            pageSize: 10,
            store: ds,
            displayInfo: true,
            displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
            emptyMsg: "没有记录"
        }) //页脚显示分页
    });


    //布局处理
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
    new Ext.Viewport({
        layout:'border',
        items:[
            {
                xtype:'box',
                region:'north',
                el: 'north',
                height:32,
                title:'north'
            },{
                region:'south',
                contentEl: 'south',
                split:true,
                height: 100,
                minSize: 100,
                maxSize: 200,
                collapsible: true,
                title:'South',
                margins:'0 0 0 0'
            },
            grid
        ]
    });

    //el:指定html元素用于显示grid
    grid.render();//Ext.getCmp('grid').render();//渲染表格
    ds.load({params:{start:0, limit:10}}); //加载数据

    grid.on("rowdblclick", function(grid) {
        loadFormData(grid);
        //alert(form1.reader);
    });

    // 载入被选择的数据行的表单数据
    var loadFormData = function(grid) {
        var _record = grid.getSelectionModel().getSelected();
        if (!_record) {
            Ext.example.msg('修改操作', '请选择要修改的一项!');
        } else {
            myFormWin();
            form1.form.load( {
                url : EDIT_ACTION_URL+'?sid='+ _record.get('id'),
                waitMsg : '正在载入数据...',
                success : function(form,action) {
                    Ext.example.msg('编辑', '载入成功!');
                },
                failure : function(form,action) {
                    Ext.example.msg('编辑', '载入失败');
                }
            });
        }
    };




    var myFormWin = function() {
        // create the window on the first click and reuse on subsequent
        // clicks

        if (!newFormWin) {
            newFormWin = new Ext.Window( {
                el : 'topic-win',
                layout : 'fit',
                width : 400,
                height : 300,
                closeAction : 'hide',
                plain : true,
                title : '窗口',
                items : form1
            });
        }
        newFormWin.show('New1');
    };



    form1 = new Ext.FormPanel( {
        // collapsible : true,// 是否可以展开
        labelWidth : 75, // label settings here cascade unless overridden
        url : 'AddLevel.action',
        frame : true,
        title : '修改',
        bodyStyle : 'padding:5px 5px 0',
        width : 350,
        waitMsgTarget : true,
        //这个属性决定了load和submit中对数据的处理,list必须是一个集合类型,json格式应该是[]包含的一个数组
        reader: new Ext.data.JsonReader({root:'list'},
                                        [{name: 'id',mapping:'id',type:'string'},
                                         {name: 'sex',mapping:'sex',type:'string'},
                                         {name: 'memo',mapping:'memo',type:'string'}
                                        ]),
        defaults : {
            width : 230
        },
        defaultType : 'textfield',
        items : [ {
            fieldLabel : '编号',
            name : 'id',
            allowBlank : false
        }, {
            fieldLabel : '性别',
            name : 'sex',
            allowBlank : false
        }, new Ext.form.TextArea( {
            fieldLabel : '备注',
            name : 'memo',
            growMin : 234
        })],

        buttons : [ {
            text : '保存',
            disabled : false,
            handler : function() {
                if (form1.form.isValid()) {
                    form1.form.submit( {
                        url : 'AddLevel.action',
                        success : function(from, action) {
                            Ext.example.msg('保存成功', '添加级别成功!');
                            ds.load( {
                                params : {
                                    start : 0,
                                    limit : 30,
                                    forumId : 4
                                }
                            });
                        },
                        failure : function(form, action) {
                            Ext.example.msg('保存失败', '添加级别失败!');
                        },
                        waitMsg : '正在保存数据,稍后...'
                    });
                    dialog.hide();
                } else {
                    Ext.Msg.alert('信息', '请填写完成再提交!');
                }
            }
        }, {
            text : '取消',
            handler : function() {
                newFormWin.hide();
            }
        }]
    });



});
分享到:
评论
1 楼 happenZheng 2011-04-01  
你好,我现在也刚开始接触ext js,感觉这个框架很庞大,很难入手。
可否给点学习意见,跟在学的过程,应该注意些什么?谢谢!

相关推荐

    ExtJs实现数据加载和提交经典代码

    根据提供的文件信息,我们可以深入探讨如何在ExtJS中利用FormPanel进行数据加载和提交的核心概念与实践技巧。 ### FormPanel的Form对象 在ExtJS框架中,`FormPanel`是处理表单数据的一个核心组件。当我们在使用`...

    ExtJs4.0 表单提交Demo

    在“ExtJs4.0 表单提交Demo”中,我们将深入探讨如何在ExtJs 4.0环境下,通过Ext Ajax模块实现表单的数据提交,同时实现显示层和控制层的分离,提升代码的可维护性和可扩展性。 1. **ExtJs 4.0 表单基础** ExtJs ...

    extjs中的formPanel以及表单的应用

    FormPanel 是 ExtJS 中的一个核心组件,用于创建和处理表单元素,包括输入字段、按钮、选择框等。它提供了丰富的功能,如数据验证、远程提交、异步加载等,是构建用户交互界面的关键部分。 在ExtJS中,FormPanel是...

    Extjs4的FormPanel从后台load json数据的要点

    在Extjs4中,可以使用`form.load()`方法将JSON数据加载到FormPanel中。这个方法接收一个配置对象作为参数,该对象通常包括URL、请求类型(GET或POST)、成功回调函数和失败回调函数等属性。当后端服务器返回JSON数据...

    extJs中关于formPanel动态添加组件的验证问题

    在EXT JS这个强大的JavaScript框架中,FormPanel是用于创建表单的重要组件,它允许开发者构建交互式的、数据驱动的Web应用程序。FormPanel不仅提供了一种布局管理方式,还支持各种表单元素,如文本框、复选框、下拉...

    ExtJs 动态添加表单

    在"动态添加表单"这个主题中,我们将深入探讨如何在ExtJS中实现表单的动态创建和管理。 首先,我们要理解表单(Form)在ExtJS中的基本概念。表单是数据输入和验证的核心组件,可以包含各种字段类型,如文本框、下拉...

    如何提交Extjs 中的表单

    在ExtJS中,提交表单是一项常见的操作,用于将用户在表单中填写的数据发送到服务器进行处理。本文将详细讲解如何在ExtJS环境中实现表单的提交,并结合Java Web后端进行交互。 首先,我们需要了解ExtJS中的表单组件...

    FCKeditor结合extjs实例

    这种结合允许用户在表单提交内容时,享受到类似于桌面应用的文本编辑体验,同时利用ExtJS的其他功能,如表格展示、数据管理和用户界面的美化。 集成FCKeditor到ExtJS应用中通常需要以下步骤: 1. 引入FCKeditor的...

    自我扩展FormPanel 和Store

    在ExtJS中,我们可以通过继承FormPanel和Store类,然后重写或添加方法来实现自我扩展。例如,我们可能想要增加自定义验证规则,优化数据加载逻辑,或者添加特定的事件处理。 实现自我扩展FormPanel时,我们可以创建...

    asp.net下extjs完整实例

    此外,EXTJS的Store组件可以管理数据存储,它可以连接到ASP.NET的数据服务,实现数据的获取、添加、删除和更新。EXTJS的Model定义了数据结构,与ASP.NET的数据实体类相对应,方便数据的双向绑定。 在样式和布局方面...

    extjs实现权限拦截

    通过使用FormPanel组件,我们可以创建包含用户名和密码输入框的表单,同时添加提交按钮。表单提交时,可以通过Ajax请求将数据发送到后端进行验证。 2. **SSH框架集成** 后端使用SSH框架,Spring负责依赖注入和管理...

    extjs4如何给同一个formpanel不同的url_.docx

    在EXTJS4的API中,通常我们会看到一个`url`属性,这个属性指定了FormPanel在提交表单时将数据发送到的服务器端处理地址。然而,如果希望同一个FormPanel实例能够根据不同的上下文提交到不同的URL,我们需要稍微调整...

    extjs上传全代码

    6. **服务器端处理**: 在EXTJS中完成前端的文件选择和提交后,服务器端需要接收并处理这些上传请求。这通常涉及到接收文件流,将其保存到服务器的指定位置,并可能需要返回一些确认信息。 7. **进度条显示**: 虽然...

    FormPanel的插入与删除

    7. **最佳实践**:动态操作FormPanel时,应遵循最佳实践,如延迟加载未使用的字段以减少初始加载时间,使用合适的布局管理器优化空间利用,以及确保数据验证和提交逻辑的健壮性。 总结起来,这篇博客内容涵盖了...

    ExtJS_3.3中文

    4. **Store和Model**:Store是数据存储的抽象,负责加载和管理数据,Model定义了数据结构和行为,两者共同构成了数据层。 5. **GridPanel**:ExtJS的表格组件,可展示大量数据,并提供排序、分页、编辑等功能,是...

    Extjs和数据库交互,增删改查

    Proxy会根据配置的URL和参数发送请求,服务器返回数据后,Store将数据加载到内存中。 3. 更新(Update):当用户修改记录时,Store会检测到数据变化并标记为脏(dirty)。调用Store的sync方法,会将所有脏记录通过...

    ExtJs 登陆框、框架

    在C#开发环境中,ExtJS 可以作为前端技术与后端的C#服务进行交互,实现数据的动态加载和展示。 在“C# Extjs 登陆框、框架”这个主题中,我们主要关注的是如何使用ExtJS创建一个登录界面,并结合C#后端实现用户验证...

    ExtJs、ASP.net运用Linq to SQL与SQL储存过程交互.

    在ExtJs中,可以通过FormPanel组件轻松实现表单的构建及提交。为了确保数据的安全性以及提升性能,通常推荐将表单数据通过Ajax方式提交给服务器端进行处理。具体实现方法如下: 1. **创建FormPanel**:在前端使用...

    extjs2.1库文件

    Model定义了数据结构,Store负责存储和管理数据,Proxy则处理数据的获取和提交,实现了数据和视图的实时同步。 4. **事件处理**:ExtJS 2.1的事件驱动模型使得用户交互变得简单,每个组件都有一系列预定义的事件,...

Global site tag (gtag.js) - Google Analytics