我们都知道,Vs.Net这样的工具每次打开时都会记住我们上次关闭时的状态:各个窗口的位置、大小;工具栏状态;自定义菜单项等。这无疑是一个使用的功能。ExtJs也包含提供了状态保存机制,其主要的控件:GirdPanel,FormPanel等,都提供了状态保存的功能。我们需要的仅仅是为其提供适当的Provider。
1,客户端状态的保存
我们先来看一下当一个ExtJs中的控件状态改变时,持久化该控件状态的流程:
开发MIS系统(3):使用数据库保存客户端状态-">
流程中的前两步(红色)是控件负责的。当控件状态改变时,会使用JSON串行化自身状态,然后调用Ext.state.Manager.getProvider()这个静态方法取得当前程序配置的Provider,进而调用Provider的set方法,保存自身状态。我们需要做的便是提供一个Provider,当其set方法被调用时,将传递过来的控件状态保存到服务器就可以了。该Provider的代码如下:
1: Srims.providerCtor = Ext.extend(Ext.state.Provider, {
2:
3: get: function(name, defaultValue){
4: //alert('get:' + name + ' : ' + Srims.provider._state[name]);
5: //return defaultValue;
6:
7: if (Srims.provider._state[name])
8: return Ext.util.JSON.decode(Srims.provider._state[name]);
9:
10: return defaultValue;
11: },
12: set: function(name, value){
13: //alert('set:' + name + ' ' + Ext.util.JSON.encode(value));
14: var valueString = Ext.util.JSON.encode(value)
15: Srims.provider._state[name] = valueString;
16:
17: Ext.Ajax.request({
18: url: '/User.asmx/SetExtClientState',
19: method: 'POST',
20: params: {
21: key: name,
22: value: valueString
23: }
24: });
25: },
26: clear: function(name){
27: Srims.provider._state[name] = undefined;
28: }
29: });
30:
31: Srims.provider = new Srims.providerCtor();
32: Srims.provider._state = new function(){
33: };