州提供商无法正确恢复分拣机

时间:2015-11-28 06:19:22

标签: extjs

我尝试使用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中正确恢复。

有什么建议吗?

1 个答案:

答案 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方法