在 Birt 处理程序上使用 Javascript reportContext.setPersistentGlobalVariable 方法在进程之间传递对象

Using Javascript reportContext.setPersistentGlobalVariable method on Birt handlers To pass objects between processes

我试图将变量从工厂进程传递到 运行 进程, 在 eclipsde UI 透视图中使用 reportContext.setPersistentGlobalVariable。 在数据集的 onFetch() 中,代码如下所示:

var flag = "hello";
reportContext.setPersistentGlobalVariable("flag", flag);

在报表设计的 beforeRender() 方法中,代码如下所示:

var flg = reportContext.getPersistentGlobalVariable("flag");
reportContext.getDesignHandle().findElement("text").setContent(flg);

应该注意的是,当我将这两个片段放在报告设计的两个 on..() 方法中时,这段代码是有效的。 不知何故,数据无法在两个进程之间传递。

我能够重现与您描述的类似的行为。请尝试在报表末尾插入动态文本元素并设置此表达式,它应该可以工作:

reportContext.getPersistentGlobalVariable("flag");

您的报告很可能是 运行 一个独特的 "RunAndRender" 任务,而如果我们想利用 beforeRender 和 onRender 事件,我们应该使用两个单独的 "Run" 和 "Render" 任务。

在使用 Eclipse Designer 的实践中,如果我们 运行 使用 Web 查看器 ("View report in Web Viewer") 报告,则有两个单独的任务,但如果我们直接 运行 导出 ("View report as xxx") 只有一个任务。

就是说,重要的是要注意处理渲染事件是棘手的:大多数时候,当您尝试在此处更改 designHandle 元素时,为时已晚。例如,甚至 "visibility" 属性 元素也无法在渲染时更改。您可以使用此元素的 "onRender" 事件更改文本的内容:

this.text=reportContext.getPersistentGlobalVariable("flag");