这个是页首

EXTJS4 学习日志2

1.STORE和MODEL的封装

例外处理,READER的一些通用熟悉要进行封装。EXTJS3的时候这些东西都写到BASESTORE中即可,现在需要写到STORE和MODEL中。

安计划是将proxy封装到BASEMODEL中,结果发现BASEMODEL使用constructor方法无法解决继承的问题。即:由于STORE中引用MODEL不是用CREATE的方法,而是直接指定类,所以创建的时候,BASEMODEL并不执行constructor中的方法。所以PROXY的定义只能房到basestore中。

-------------

2.关于例外的处理。

在store, model中在与服务器出现错误后,有会有提示,但是不能得到详细信息。

store的load事件增加了successful参数,可以知道调用是否成功,但是如果失败,没办法得到失败信息。

文档中load事件的参数如下:

load( Ext.data.store this, Array records, Boolean successful, Ext.data.Operation operation, Object options ),但是查看其代码发现:

在store的onProxyLoad方法中代码如下:

me.fireEvent('load', me, records, successful);

 

也就是说,load事件并无法得到operation和options 的参数。

即使得到operation,operation也只能通过getError( )这个方法获得错误信息,这个信息不够详细,只有status和code.

所以要想得到详细的服务器错误信息,只能到proxy中。

ajax的proxy的事件exception有如下参数:

exception( Ext.data.proxy.Proxy this, Object response, Ext.data.Operation operation, Object options )

这里的response可以得到所有返回结果。

--------------------------

以下是封装后的代码:

Ext.define('Hljs.component.BaseStore', {
    extend: 'Ext.data.Store',
    //hl add 20100421
    showWaitWindow: true,
    constructor: function(config){
        config = config || {};
        Ext.apply(config, {
            proxy: {
            type: 'ajax',
            actionMethods: { read: 'POST'},
            api:{
                read: _path + '/' + config.action + config.isSpCall?'?act=spCall':'?act=query',
                read: _path + '/' + config.action + '?act=query',
                create : _path + '/' + config.action + '?act=insert',
                update: _path + '/' + config.action + '?act=update',
                destroy: _path + '/' + config.action + '?act=delete'
            },
            reader: {
                type: 'json',
                root: 'root',
                totalProperty: 'totalProperty',
                successProperty: 'success'
            },
            writer:{
                encode: true,
                root: 'root'
            },
            listeners:{
                exception: function(p, res, oper, opt){
                alert('a');
            }
            }
        }           
        });
        this.callParent([config]);
    }    ,
    onProxyLoad: function(operation) {
        if(!operation.wasSuccessful()){
            var error = operation.getError();
        }
        this.callParent([operation]);
    }

});

Ext.define('Hljs.component.BaseModel', {
    extend: 'Ext.data.Model'
});

-----------------------------------------------

3.关于命名空间

原先的Hljs.util.PageHelper是一个单例,取消了Ext.namespace,如果还是定义Hljs.util.PageHelper = new (function(){。。。})就会报错,解决的办法是:

把原先的定义:Ext.namespace("Hljs.util");

修改成:

Ext.define('Hljs.util', {
});

posted @ 2011-09-02 17:53  网际浪人1  阅读(683)  评论(0编辑  收藏  举报
这个是页脚