`
ootabc
  • 浏览: 110832 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

this.form.el is undefined FormPanel或Panel加载数据

阅读更多
转载: http://www.cyiyuan.com/showtopic-789.html
在开发EXTJs的表单程序时,我们经常需要对FormPanel进行数据编辑的工作,而编辑数据的时候,需要把服务端的数据抓取回来并填充取表单的控件中去以完成数据的回填工作,以便于用户的编辑工作,而EXTJs大部分程序会写成以下的方式。
//formPanel的items如下所示:

                           {
                                        fieldLabel : '新闻标题',
                                        name : 'news.subject',
                                        width :400,
                                        id : 'subject'
                                },{
                                           fieldLabel:'桌面新闻',
                                        name:'isDeskImage',
                                        id:'isDeskImage',
                                        xtype:'checkbox',
                                        handler:function(obj){
                                                if(obj.getValue()){
                                                        Ext.getCmp('CheckOutImageButton').show();

                                                }else{

                                                        Ext.getCmp('CheckOutImageButton').hide();

                                                }

                           }

//.................

//加载数据
this.formPanel.getForm().load({
                        deferredRender : false,
                        url : __ctxPath + '/info/getNews.do?newsId=' + this.newsId,
                        waitMsg : '正在载入数据...',
                        success : function(form, action) {
                        },

                        failure : function(form, action) {
                                Ext.ux.Toast.msg('编辑', '载入失败');
                        }


});


而该url返回的json数据格式如下所示:
{success:true,data:{"author":"csx","content":"<p>国际关系紧张国际关系紧张国际关系紧张国际关系紧张国际关系紧张国际关</p>","createtime":1284706528000,"firstKeyColumnName":"newsId","id":5,"isDeskImage":1,"issuer":"csx","newsId":5,"newsType":{"class":"com.htsoft.oa.model.info.NewsType_$$_javassist_118","sn":3,"typeId":4,"typeName":"国际新闻"},"replyCounts":3,"status":1,"subject":"国际关系紧张","subjectIcon":"info/news/201009/7de72a2ab73e4ced9779a87606d96b1f.jpg","typeId":4,"updateTime":1285482215000,"viewCounts":51}}


使用以上方式存在以下问题:

  1.表单控件必须用id,如"subject",表单控件若用id就可能会跟其他控件存在id冲突。

  2.用 formPanel.getForm.load()方法自动加载的时候,经常会出现错误“this.form.el is undefined”

鉴于此,我们对加载进行了扩展,如:
Ext.override(Ext.Panel, {
        loadData:function(conf){
                var ct=this;
                //遍历该表单下所有的子项控件,并且为它赋值        
                var setByName=function(container,data){
                        var items=container.items;
                        if(items!=null){
                                for(var i=0;i<items.getCount();i++){
                                        var comp=items.get(i);
                                        if(comp.items){
                                                setByName(comp,data);
                                                continue;
                                        }
                                        //判断组件的类型,并且根据组件的名称进行json数据的自动匹配
                                        var xtype=comp.getXType();
                                        try{
                                                if(xtype=='textfield' || xtype=='textarea' || xtype=='radio' || xtype=='checkbox' 
                                                        || xtype=='datefield' || xtype=='combo' || xtype=='hidden' || xtype=='datetimefield'
                                                        ||xtype=='htmleditor'
                                                        || xtype=='label' || xtype=='fckeditor'
                                                        ){
                                                        var name=comp.getName();
                                                        if(name){
                                                                if(conf.preName){
                                                                        name=name.substring(conf.preName.length+1);
                                                                }
                                                                var val=eval('data.'+name);
                                                                if(val){
                                                                        comp.setValue(val);
                                                                }
                                                        }
                                                }
                                        }catch(e){
                                                //alert(e);
                                        }
                                }
                        }
                };
                if (!ct.loadMask) {
                        ct.loadMask = new Ext.LoadMask(Ext.getBody());
                        ct.loadMask.show();
                }
                Ext.Ajax.request({
                        method:'POST',
                        url:conf.url,
                        scope:this,
                        success:function(response,options){
                                var json=Ext.util.JSON.decode(response.responseText);
                                var data=null;
                                if(conf.root){
                                        data=eval('json.'+conf.root);
                                }else{
                                        data=json;
                                }
                                setByName(ct,data);
                                if(ct.loadMask){
                                        ct.loadMask.hide();
                                        ct.loadMask = null;
                                }
                                if(conf.success){
                                    conf.success.call(ct,response,options);
                                }
                        },//end of success
                        failure:function(response,options){
                                if(ct.loadMask){
                                        ct.loadMask.hide();
                                        ct.loadMask = null;
                                }
                                if(conf.failure){
                                    conf.failure.call(ct,response,options);
                                }
                        }
                });
        }
});



使用方式如下:

this.formPanel.loadData({
                        root : 'data',
                        preName:'news',
                        url : __ctxPath + '/info/getNews.do?newsId=' + this.newsId,
                        success : function(form, action) {
                        },

                        failure : function(form, action) {
                                Ext.ux.Toast.msg('编辑', '载入失败');
                        }


});


以上方式就不需要表单的控件使用id,并且效率设值对load的方式要快得多,但对于没有id如何取某个控件的值呢,extjs大部分的api都是按id取值。

我们在container上提供了另一个方法,可以按名称取到控件。

Ext.override(Ext.Container, {
        getCmpByName : function(name) {
                var getByName = function(container, name) {
                        var items = container.items;
                        if (items != null) {
                                for (var i = 0; i < items.getCount(); i++) {
                                        var comp = items.get(i);
                                        var cp = getByName(comp, name);
                                        if (cp != null)
                                                return cp;
                                        if (comp.getName && name == comp.getName()) {
                                                return comp;
                                                break;
                                        }
                                }
                        }
                        return null;
                };
                return getByName(this, name);
        }
});

分享到:
评论
1 楼 xyc717 2012-09-04  
你前面那黄色字颜色能在恶心点么……

相关推荐

    EXT.form组件

    1. `form`:`Ext.FormPanel`是EXT JS中的表单面板,它是一个容器,可以容纳各种表单字段和其他组件。表单面板允许你定义布局、提交行为以及处理表单数据的方法。 2. `checkbox`:`Ext.form.Checkbox`是用于创建复选...

    Ext form_load

    在Ext JS中,`Ext.form_load`涉及到的主要知识点是FormPanel的数据加载机制,这包括了对FormPanel的form对象、BasicForm、doAction方法、Ext.form.Action对象以及JsonReader的使用。以下是对这些概念的详细解释: 1...

    Ext 添加功能form表单实例

    if(userForm.getForm().isValid()){ if(Ext.getCmp('password').getValue() != Ext.getCmp('password1').getValue()){ Ext.Msg.alert('提示','两次密码不一致'); return; } // 验证复选框是否被选中 var ...

    ExtJs 动态添加表单

    通过`bind`方法或`form.loadRecord`方法可以加载和保存数据。 7. **表单验证**: 表单验证是确保用户输入符合预设规则的关键部分。ExtJS提供内置的验证功能,可以在字段级别或表单级别设置验证规则。 在这个案例...

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

    在本篇文章中,我们将深入探讨如何使用Extjs4中的FormPanel组件从后台加载JSON数据,并将其映射到表单的各个字段中进行显示。这是一项非常实用的技术,尤其是在需要动态填充表单的情况下。 ### 一、Extjs4 ...

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

    3. **更新验证状态**:如果在表单已经初始化并显示的情况下添加字段,可能需要手动触发FormPanel的验证,可以使用`formPanel.getForm().isValid()`来检查整个表单是否有效。 4. **错误处理**:当验证失败时,EXT JS...

    简单的两种Extjs formpanel加载数据的方式

    在ExtJS中,`Ext.form.Panel`(或简称为`formpanel`)是一种非常重要的组件,用于创建表单来收集用户输入的数据。本文将详细介绍两种在ExtJS formpanel中加载数据的方法,以供开发者参考。 ### 方法一:使用`...

    Ext 动态加载表单数据

    formPanel.getForm().loadRecord(store.getAt(0)); // 加载第一条记录 } } }); ``` 通过以上步骤,你可以实现动态加载Ext表单数据的功能。在实际应用中,可能还需要考虑错误处理、数据验证、动态更新等问题,但...

    ExtJs 文本框后附件单位

    == 'undefined' && this.width &gt; 0) { this.width = this.width - (this.unitText.replace(/[^\x00-\xff]/g, "xx").length * 6 + 2); } // 修改错误提示图标的位置 this.alignErrorIcon = function () { this....

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

    当我们在使用`FormPanel`时,常常需要使用到其内部的`form`对象来进行数据的加载或提交。这里的`form`对象实际上是`Ext.form.BasicForm`类型,它包含了`load`和`submit`两种方法,用于完成数据的加载和提交工作。 #...

    自我扩展FormPanel 和Store

    Store则是一个数据容器,它负责存储和管理数据模型,可以与各种组件(如GridPanel或FormPanel)进行数据绑定,实现数据的实时更新和同步。 自我扩展(self-extending)是一种设计模式,允许我们在现有的类基础上...

    extjs-form组件配置参数详解

    `Ext.form.Action`是ExtJS中的一个类,用于处理表单提交和加载数据的动作。它提供了多种配置选项和属性来控制表单操作的过程。 **配置项** - **success**: 执行成功后的回调函数,该函数接收两个参数:`form`(当前...

    extjs中的formPanel以及表单的应用

    同时,`loadRecord`方法可以用来从记录对象中加载表单数据,而`getValues`和`getRecord`则用于获取当前表单的值或转换为记录对象。 在工具方面,ExtJS 提供了一些实用的工具类,如`Ext.Ajax`用于处理Ajax请求,`Ext...

    ExtJs_xtype一览

    - `form`:`Ext.FormPanel` 或 `Ext.form.FormPanel`,用于创建表单的容器。 - `checkbox`:`Ext.form.Checkbox`,多选框组件。 - `combo`:`Ext.form.ComboBox`,下拉选择框。 - `datefield`:`Ext.form....

    Extjs 词语定义

    - 其他方法如 `clearInvalid` 清除无效验证信息,`findField` 查找表单字段,`getValues` 获取表单数据,`isDirty` 检查数据是否已修改,`isValid` 进行客户端验证,`load` 加载数据,`loadRecord` 从记录加载数据...

    ExtJs4.0 表单提交Demo

    ExtJs 4.0的FormPanel对象提供了`getForm()`方法获取表单实例,然后通过`form.submit()`或`form.serialize()`方法完成数据的序列化。 4. **表单提交过程** - **创建表单组件**:首先,定义一个FormPanel,并在其...

    extjs属性方法大全

    `Ext.form.Action` 是用于处理表单操作的类,主要包括提交和加载数据的功能。 - **属性:** - `success`: 表示操作成功时的回调函数。 - `failure`: 表示操作失败时的回调函数。 - `method`: 请求方式,默认为 `...

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

    var form = panel.getForm(); ``` 然后,我们可以在适当的时候为BasicForm设置不同的URL,比如在组件添加到不同容器或触发特定事件时: ```javascript form.url = '../logselectservlet'; // 设置新的URL ``` ...

Global site tag (gtag.js) - Google Analytics