如何控制rallygridboard的生成时机?待TreeStore关联数据加载完成
我来帮你梳理下解决思路,针对你遇到的Rally GridBoard和TreeStore关联数据加载顺序问题,有几个可行的方案:
1. 暂停GridBoard渲染直到关联数据加载完成
你可以通过阻止TreeStore自动加载,手动控制数据加载流程,等主数据+关联数据全部就绪后再触发GridBoard的渲染。具体步骤如下:
- 创建TreeStore时关闭自动加载,避免它提前触发GridBoard渲染
- 手动加载主数据,在回调中批量加载所有记录的
predecessor和successor - 等所有关联数据加载完成后,再初始化或刷新GridBoard
示例代码:
// 创建TreeStore,关闭自动加载 const treeStore = Rally.data.wsapi.TreeStoreBuilder() .autoLoad(false) // 关键配置:不让Store自动触发加载 .model('Feature') .build(); // 手动加载主数据 treeStore.load({ callback: function(records, operation, success) { if (!success) return; // 批量加载所有记录的关联数据,用Promise统一管理异步流程 const loadAssociation = (assocStore) => { return new Promise((resolve, reject) => { assocStore.load({ callback: (recs, op, ok) => ok ? resolve(recs) : reject(op.error) }); }); }; const allAssocPromises = records.map(record => { return Promise.all([ loadAssociation(record.get('Predecessors')), loadAssociation(record.get('Successors')) ]); }); // 等所有关联数据加载完毕,触发GridBoard渲染 Promise.all(allAssocPromises).then(() => { gridBoard.refresh({ store: treeStore }); }).catch(err => console.error('关联数据加载失败:', err)); } }); // 初始化GridBoard时先不传store,等数据就绪后再设置 const gridBoard = Ext.create('Rally.ui.gridboard.GridBoard', { // 其他基础配置 store: null, // ... });
2. 手动控制GridBoard的刷新时机
如果GridBoard已经提前初始化,你可以拦截过滤器变更事件,重新控制数据加载和刷新的顺序,避免默认流程导致的顺序混乱:
示例代码:
// 拦截GridBoard的过滤器变更事件,阻止默认刷新行为 gridBoard.on('filterchange', function(filterConfig) { // 阻止默认的自动刷新逻辑 Ext.EventManager.stopEvent(arguments[1]); // 给TreeStore应用新过滤器并加载主数据 treeStore.clearFilter(true); treeStore.filter(filterConfig.filters); treeStore.load({ callback: function(records, operation, success) { if (!success) return; // 重复之前的关联数据加载流程 const loadAssociation = (assocStore) => { return new Promise((resolve, reject) => { assocStore.load({ callback: (recs, op, ok) => ok ? resolve(recs) : reject(op.error) }); }); }; const allAssocPromises = records.map(record => { return Promise.all([ loadAssociation(record.get('Predecessors')), loadAssociation(record.get('Successors')) ]); }); // 所有数据就绪后,手动触发GridBoard刷新 Promise.all(allAssocPromises).then(() => { gridBoard.refresh({ store: treeStore, filters: filterConfig.filters }); }); } }); });
另外你还可以给TreeStore自定义一个associatesloaded事件,当关联数据加载完成时触发,让GridBoard监听这个事件来执行刷新,这样代码会更模块化。
核心思路就是把关联数据加载和GridBoard渲染解耦,不要依赖TreeStore的默认load事件驱动渲染,而是等所有必要数据都准备好后,再主动触发GridBoard的刷新逻辑,这样就能解决过滤器应用时的顺序问题。
内容的提问来源于stack exchange,提问作者Michael Østerberg Jakobsen
相关产品推荐
相关产品推荐

