我尝试使用Ext.state.CookieProvider存储我的网格状态。问题是,当状态本身(宽度,顺序)正确恢复时,我无法恢复分拣机参数。
首先,我在viewport viewcontroller的init()方法中创建了cookieprovider:
Ext.state.Manager.setProvider(Ext.create('Ext.state.CookieProvider', {}));
我的商店设置为使用远程排序自动加载:
Ext.define('MyApp.requests.store.QueryRequestsGridStore', {
extend: 'Ext.data.Store',
model: 'MyApp.requests.model.QueryRequestsGridModel',
alias: 'store.queryRequestsGrid',
remoteSort: true,
autoLoad: true,
proxy: {
startParam: 'offset',
limitParam: 'limit',
url: '/requests',
noCache: false,
type: 'ajax',
reader: {
type: 'json',
rootProperty: 'data',
totalProperty: 'total'
}
},
});
使用viewmodel绑定在网格中定义商店:
bind: {
store: '{queryRequestsGrid}'
},
我在按钮点击时从视口viewcontroller加载包含商店的网格,如下所示:
var panelToAddName = Ext.create('MyApp.requests.view.QueryRequestsGridView', {});
var mainViewPort = Ext.ComponentQuery.query('#mainViewPort')[0];
var regionPanel = mainViewPort.down('[region=center][xtype=panel]');
regionPanel.removeAll();
regionPanel.add(panel);
Cookie包含分拣机,但网格加载时没有任何排序参数。
"storeState":{"sorters":[{"root":"data","property":"date_completed","direction":"ASC"}]}}}
我已经挖掘了ext-all-debug.js源文件,并找到了一个' Ext.state.Stateful'的initState()方法。类。
initState: function() {
var me = this,
id = me.stateful && me.getStateId(),
hasListeners = me.hasListeners,
state, combinedState, i, len, plugins, plugin, pluginType;
if (id) {
combinedState = Ext.state.Manager.get(id);
if (combinedState) {
state = Ext.apply({}, combinedState);
if (!hasListeners.beforestaterestore || me.fireEvent('beforestaterestore', me, combinedState) !== false) {
plugins = me.getPlugins() || [];
for (i = 0 , len = plugins.length; i < len; i++) {
plugin = plugins[i];
if (plugin) {
pluginType = plugin.ptype;
if (plugin.applyState) {
plugin.applyState(state[pluginType], combinedState);
}
delete state[pluginType];
}
}
me.applyState(state);
if (hasListeners.staterestore) {
me.fireEvent('staterestore', me, combinedState);
}
}
}
}
},
如果要从此方法内部记录 me.store ,则商店会在控制台中显示为 ext-empty-store ,而 me 是我加载的网格。在商店正确加载之前,似乎状态正在应用。
如果要在beforerender grid事件中重用initState方法,则排序器正在从cookie中正确恢复。
有什么建议吗?
答案 0 :(得分:2)
我没有使用viewmodel绑定作为存储和网格之间的唯一绑定,并且不能评论它是否应该工作,或者只是偶然。
但我知道viewmodel处理得很晚,因为视图必须首先完全初始化(包括applyState
),因此viewmodel可以找到它想要绑定监听器的所有组件。
所以请尝试使用两个&#34; old-school&#34;中的任何一个来添加商店。即使没有视图模型也可以工作的方法:网格上的store:'MyStoreId'
或store:Ext.create('MyApp.store.MyStore')
。这样,商店应该在applyState
之前绑定到网格。
此外,我还看到了您应该解决的另一个问题:您的商店在商店初始化后直接加载。 (autoLoad:true
)。那个时候,它尚未受到电网的束缚;因此,没有应用排序/过滤器,这意味着启用remoteSort
/ remoteFilter
后,您向服务器发送了太多请求。我建议只有在将应用程序应用到网格后(在callParent调用之后的grid.initComponent中,或者从grid.boxready listener中)加载存储。如果您真的想使用autoLoad
,我建议您查看setAutoLoad
方法