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', {
});