我们为Spotfire Web Player开发了CustomTool。在TablePlot上标记了一行,右键单击该工具会在上下文菜单中显示一个菜单项。选择该菜单项后,会显示一个弹出窗口。用户可以填写一些数据,然后在弹出窗口中单击“确定”,数据将保存到数据库中。这很棒!
此工具在AddIn中注册了Spotfire,如下所示:
protected override void RegisterTools(ToolRegistrar registrar)
{
base.RegisterTools(registrar);
registrar.Register<TablePlotCellContext>(new CustomToolOneWeb());
}
弹出窗口在AddIn中注册了Spotfire,如下所示:
protected override void RegisterViews(AddIn.ViewRegistrar registrar)
{
base.RegisterViews(registrar);
registrar.Register(typeof(PromptControl), typeof(PopupModel), typeof(Popup));
}
以下代码中的yield行会导致弹出窗口。
public class CustomToolOneWeb: CustomTool<TablePlotCellContext>
{
...
protected override IEnumerable<object> ExecuteAndPromptCore(TablePlotCellContext context)
{
PopupModel popupSettings = null;
try
{
popupSettings = new PopupModel();
...
yield return popupSettings;
}
finally
{
...
}
yield break;
}
...
}
以上代码效果很好!
现在,该公司提出要求弹出窗口也需要通过TextArea中的按钮进行访问。
所以我创建了一个新的CustomTool,其功能与原始工具几乎相同。 TextArea中的按钮执行IronPython脚本,该脚本又执行我的新CustomTool。但是弹出窗口没有显示。通过调试我发现我的新CustomTool确实被执行了。在我希望弹出窗口启动时,没有任何事情发生,调试器跳转到下一行。
对于新的CustomTool,我在RegisterTools方法中添加了以下行:
registrar.Register<Spotfire.Dxp.Application.Page>(new CustomToolTwoWeb());
新的CustomTool的类只在泛型级别(Page而不是TablePlotCellContext)上进行了更改:
public class CustomToolTwoWeb : CustomTool<Page>
{
protected override IEnumerable<object> ExecuteAndPromptCore(Page context)
{
PopupModel popupSettings = null;
try
{
popupSettings = new PopupModel();
...
yield return popupSettings;
}
finally
{
...
}
yield break;
}
...
}
Spotfire中使用的IronPython脚本启动新的CustomTool(页面是类型页面的脚本参数):
import clr
clr.AddReference(".......")
import Spotfire.Dxp.Application
from CustomToolsWeb import CustomToolTwoWeb
found, tool = Application.Toolbox.TryGetTool[CustomToolTwoWeb]()
if found:
tool.Execute(page)
为什么新的CustomTool不会显示Popup和原始的CustomTool。 如何解决这个问题?
PS:在IronPython脚本中已经尝试了tool.ExecuteAndPrompt(page)
但它没有执行我的代码(使用调试器检查)并且它也不会抛出错误。
更新2015-08-14:来自TIBCO的人我得到以下简短回答:
使用Web Player,IronPython正在服务器上执行 可能是问题。因此,IronPython代码可能不行 打开一个向用户显示的弹出窗口。
这对我来说似乎是一个看似合理的技术解释。
还有其他方法,开箱即用,按钮可以在不使用IronPython的情况下触发我的工具吗?可能通过Javascript?
或者我应该尝试将自己的Ajax请求构建到/SpotfireWeb/AjaxService.asmx吗?这还有可能吗?