You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何控制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:24:00