Rally TreeStore根节点始终为null且getTopLevelNodes抛出异常求助
解决Rally Simple Tree Grid中Root Node为null及getTopLevelNodes()异常的问题
嘿,我来帮你拆解这个问题——我之前在Rally Apps开发里也碰到过几乎一模一样的坑!
核心原因:异步加载与TreeStore初始化时机
Rally的HierarchicalStore(也就是Tree Grid用的数据源)是异步加载数据的,而且它的root节点、层级结构需要等数据完全加载并完成父子关系映射后才会初始化。你遇到的问题大概率是因为:
- 你在store还没完成数据加载、层级构建的时候,就去打印root node或者调用
store.getTopLevelNodes()了 - 哪怕界面上已经显示用户故事,也不代表store内部的Tree结构已经完全初始化完成——TreeGrid渲染和store的层级构建是两个异步过程
具体解决方案
你需要把访问root节点和调用方法的逻辑,放到store的load事件回调里,确保等数据加载完成后再执行:
// 假设你的store是这样定义的 const myTreeStore = Ext.create('Rally.data.HierarchicalStore', { model: 'UserStory', // 其他配置项... }); // 监听store的load事件,在回调里操作 myTreeStore.on('load', function() { // 现在可以安全访问root node了 console.log('Root Node:', myTreeStore.getRootNode()); // 调用getTopLevelNodes()也不会报错 const topLevelStories = myTreeStore.getTopLevelNodes(); console.log('Top Level User Stories:', topLevelStories); }, this); // 如果是在TreeGrid组件里,也可以在组件的afterrender钩子中处理 Ext.create('Rally.ui.grid.TreeGrid', { store: myTreeStore, // 其他配置... listeners: { afterrender: function(grid) { const store = grid.getStore(); if (store.isLoaded()) { // 数据已加载,直接操作 console.log('Root Node:', store.getRootNode()); } else { // 数据还在加载,监听load事件 store.on('load', function() { console.log('Root Node:', store.getRootNode()); }, this, {single: true}); // single:true确保只触发一次 } } } });
额外注意点
- 如果你是在组件的
initComponent方法里直接打印,那肯定会拿到null——因为这时候store还没开始加载数据呢 - 有时候Rally的store会有缓存,但缓存的加载也是异步的,所以不要依赖缓存状态直接操作,还是要通过
load事件或者isLoaded()判断
内容的提问来源于stack exchange,提问作者Rakesh
相关产品推荐
相关产品推荐

