XSP.showDialog在onStart事件中不起作用?

时间:2013-02-11 13:05:48

标签: xpages

我有以下测试XPage。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xp:panel id="pagePanel">
        <xp:text escape="true" id="didThePageCompile">
            <xp:this.value><![CDATA[#{javascript:var d = new Date();
return d.toLocaleString();}]]></xp:this.value>
        </xp:text>
        <xp:br></xp:br>
        <xp:button value="Label" id="button1">
            <xp:eventHandler event="onclick" submit="true"
                refreshMode="partial" refreshId="dialog1"
                onStart="XSP.openDialog('#{id:dialog1}')" 
                onComplete="XSP.closeDialog('#{id:dialog1}')">
            <xp:this.action><![CDATA[#{javascript:var agent = database.getAgent("runLongTime");
var response = agent.run();

// var d = getComponent("dialog1"); 
// d.show();
}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xe:dialog id="dialog1" title="Test Dialog">This is a test dialog</xe:dialog></xp:panel>
</xp:view>

代理“runLongTime”只是睡了10秒钟。这很好用。当我单击按钮时,对话框不会显示。我检查了源代码并生成了正确的代码,当我手动将其放入控制台时,该代码可以正常工作。

我没有收到任何错误,代理执行正常。我也尝试将refreshId更改为“pagePanel”,但仍然相同。

2 个答案:

答案 0 :(得分:6)

XSP.openDialog()XSP.closeDialog()各自触发部分刷新。 XPages客户端API包含用于防止多个部分刷新操作并行执行的逻辑,这可能会阻止您显示对话框,因为当它尝试运行刷新以显示对话框时,它已经在运行您的按钮事件。 / p>

在页面中添加JSON-RPC(在控件选项板中称为“远程服务”)。将按钮的服务器事件代码移动到RPC的方法。然后,您可以将按钮事件更改为纯客户端:调用XSP.openDialog(),然后调用RPC方法并关闭该方法的onComplete中的对话框。这可以防止您目前遇到的竞争状况。

答案 1 :(得分:0)

据我所知,您正在尝试打开/关闭同一个对话框。 几天前我遇到了同样的问题,并想知道为什么这不起作用。

最后,我检查了事件并以壮观的结果结束,onStart和onComplete几乎并行启动。

也许你可以在调用XSP.closeDialog事件之前尝试插入超时(window.timeout)。