ExtJS 6 - 更新代理存储并保持当前网格状态

ExtJS 6 - Update proxy store and keep the current grid state

我有一个绑定到代理存储的树状网格,它需要通过每 X 秒调用一次网络服务来保持更新。这家商店有 N 条记录,我需要更新所有记录(例如这条记录是任务执行,我需要更新进度)。

我怎样才能 "reload" 这个网格而不丢失展开的分支? store 好像被刷新和重新填充了,如果 store 足够智能,可以添加新记录并更新以前的记录,那会很好,可以吗?

我想我遇到了同样的问题。我通过在重新加载商店时发送一个附加参数来解决它,该参数告诉后端当前扩展了哪些节点。然后我在响应中包含了扩展节点的数据,因为我只需要重新加载扩展节点(未扩展的节点是不可见的,将在扩展时加载)。

因此,在您的情况下,您可以将事件处理程序附加到商店 "beforeload" 事件,这会将有关扩展节点的信息附加到请求中。然后在加载事件中展开已展开的节点。

因此,在加载之前保存节点:

store.on("beforeload", function(store, operation) {
    var root = store.getRoot(),
        saveExpandedNodesIds = function(node) {
            if (node.childNodes) {
                Ext.Array.each(node.childNodes, function(rec){ 
                    if (rec.get('expanded')) {
                        // save to tree object
                        tree.expandedNodes[]= rec.get('id');
                        saveExpandedNodesIds(rec);
                    }
                });
            }
        }
    saveExpandedNodesIds(root);
});

并在加载时恢复展开状态

store.on("load", function() {
                fn: function(store) {
                    /**
                     * If tree has expanded nodes, expand them after load
                     */
                    if(tree.expandedNodes > 0) {
                        while(tree.expandedNodes.length > 0) {
                            var item = tree.expandedNodes.shift();
                            if (store.getById(item) !== null) {
                                store.getById(item).expand();
                            }
                        }
                    }   
                }
        });

如果你愿意,我稍后可以写一个片段。