天天看点

关于Extjs4.2的一些BUG

手头上的一个项目用到Extjs4.2框架,使用过程中发现这个版本的Extjs还是存在挺多bug的。我遇到的bug中,有一些原因不详,虽然通过修正ext-all.js源码能解决,但不清楚根本原因,故不在此处提出。下面是我能确认的几个bug:
           

1、Ext.data.Store配置autoLoad失效问题

代码如下,定义了如下全局变量store_UserInfo,在js加载的时候store_UserInfo竟然触发了beforeload事件,说明这个store在创建的时候自动调了一次load()方法。

var userInfo_Data = {"count":,"list":[]};
var store_UserInfo = Ext.create('Ext.data.Store', {
    model : 'model_userinfo',
    pageSize : ,
    autoLoad : false, //此处配了autoLoad为false
    data : userInfo_Data,//此处指定了data
    proxy : {
        type : 'memory',
        reader : {
            type : 'json',
            root : 'list',
            totalProperty: 'count',
        }
    },
    listeners : {
        beforeload:function(obj, opt){
            //store_UserInfo创建后自动地跳到这里
            loadUserInfo(opt.start, opt.limit, userInfo_query);
        }
    }
});
           

我查了Extjs4.2的开发文档,如下图。文档是这样说的:如果没有指定data,且autoLoad为true或一个Object对象,那么store会在创建后自动调用load方法

关于Extjs4.2的一些BUG

奇怪的是我指定了data,且autoLoad为false,store还是自动调了load()方法。我调试了一下,发现无论autoLoad设为true、设为false、或是缺省,store在创建后都会自动调用load()方法,也就是说autoLoad失效了。

我查了ext-all-debug.js源码,找到定义Ext.data.Store的代码段,store的construtor构造函数里有一段代码,如下图

关于Extjs4.2的一些BUG

发现,如果data设了值且proxy配了Ext.data.proxy.Memory类型的proxy,不管autoLoad是什么,store都会调read()的方法加载数据,所以触发了beforeload事件。所以,如果要想在store配了data和memory型的proxy时,控制store是否自动加载数据,做如下修改

proxy = me.proxy;
        data = me.inlineData;
        if (data) {
            if (proxy instanceof Ext.data.proxy.Memory) {
                proxy.data = data;

                //autoLoad : false 失效修正
                if(me.autoLoad){
                    me.read();
                }

               //me.read(); //修正前
            } else {
                me.add.apply(me, data);
            }

            me.sort();
            delete me.inlineData;
        } else if (me.autoLoad) {
            Ext.defer(me.load, , me, [typeof me.autoLoad === 'object' ? me.autoLoad: undefined]);


        }
           

修正后,autoLoad就生效了,缺省情况下不会自动load。

2、Ext.grid.column.Action标题不能显示的问题

在指定标题内容时,我用text指定Ext.grid.column.Action的标题,但是确显示为空。代码如下:

关于Extjs4.2的一些BUG

查看ext-all.js,发现Ext.grid.column.Action 与 Ext.grid.column.Column不一样,后者是通过配置text属性来指定标题内容,Ext.grid.column.Action是通过配置header属性来指定。

让人困惑的是Extjs4.2的文档中Ext.grid.column.Action也是通过text属性来指定标题,且没有header属性。

关于Extjs4.2的一些BUG

把Ext.grid.column.Action的text改为header即能正常显示标题。

继续阅读