从链接执行待机对话框

时间:2014-08-03 09:40:52

标签: xpages lotus-domino

以下是我所拥有的:按页面按url参数填写表单的Xpages页面。这可能需要10秒才能渲染,我想让用户知道表单正在做某事。

Fredrik Norling做了一个很棒的待机对话框,当我在按钮上使用它时它的功能很棒(保存) http://openntf.org/XSnippets.nsf/snippet.xsp?id=standby-dialog-custom-control (我在保存时对表单上的ID使用部分更新)

如何从电子邮件中的链接执行此脚本块? 有像beforepageload,afturpageload或我应该使用beforeRenderResponse的选项 如果是这样我该怎么做。

3 个答案:

答案 0 :(得分:3)

在做了一些实验之后,看起来你很难完成你想做的事情。您上面引用的事件都是服务器端事件,因此无法与用户端进行通信。 view.postScript也不适用于此。

问题是(我假设)你的所有逻辑都是在页面加载之前完成的。因此,我认为实现这一目标的唯一方法是延迟逻辑处理,直到通过部分刷新加载页面为止。

您可以通过将所有逻辑移动到自定义控件,将该自定义控件添加到面板,然后在XPage的onClientLoad事件中执行此操作,对面板进行部分刷新,这将触发待机功能自动。

我嘲笑了我所说的一个例子:

Xpage code

<xp:this.beforePageLoad><![CDATA[#{javascript:viewScope.showLogic = false}]]></xp:this.beforePageLoad>
<xp:panel id="panelLogic">
    <xc:logic id="logic"
        rendered="#{javascript:viewScope.showLogic == true;}">
    </xc:logic>
</xp:panel>
<xp:br></xp:br>
<xp:br></xp:br>


<xc:standby></xc:standby>


<xp:eventHandler event="onClientLoad" submit="true"
    refreshMode="partial" refreshId="panelLogic">
    <xp:this.action><![CDATA[#{javascript:viewScope.showLogic = true;}]]></xp:this.action>
</xp:eventHandler>
</xp:view>

上面代码的关键部分是在页面加载时将viewScope变量设置为“false”,然后在部分刷新之前将其设置为“true”。将其设置为true将取消隐藏逻辑自定义控件并允许其正常处理。

逻辑自定义控件

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:text escape="true" id="computedField1">
        <xp:this.value><![CDATA[#{javascript:for (x=0;x<100000000;x++) {

}}]]></xp:this.value>
    </xp:text>
</xp:view>

我怀疑可能有更好的方法来做到这一点,但这种方法效果很好。

答案 1 :(得分:1)

我会将XPage加载为空,并在页面的onload事件中单击一个隐藏按钮。 此按钮将执行一些服务器端SSJS,它将显示您要显示的控件。然后Standby小部件将处理其余部分。用户将获得等待对话框。

 <xp:view xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xc="http://www.ibm.com/xsp/custom">

    <xp:button value="Clickme" id="LoadWait"
        style="visibility:hidden;display:none">
        <xp:eventHandler event="onclick" submit="true"
            refreshMode="partial" refreshId="MainContent">
            <xp:this.action><![CDATA[#{javascript:viewScope.HideOnLoad=true}]]></xp:this.action>
        </xp:eventHandler>
    </xp:button>
    <xp:div id="MainContent">
        <xp:div>
            <xp:this.rendered><![CDATA[#{javascript:if(!viewScope.HideOnLoad){
return false
}else{
return true
}}]]></xp:this.rendered>
            <xp:div>
                <xp:table>
                    <xp:tr>
                        <xp:td>
                            <xp:label id="label1">

                            <xp:this.value><![CDATA[#{javascript:var startTime = new Date().getTime();
var elapsedTime = 0;
var timeOutSeconds = 20;

while ( elapsedTime < timeOutSeconds) {
  java.lang.Thread.currentThread().sleep(1000);
  //re-check condition here

  elapsedTime = (new Date().getTime() - startTime) / 1024;
}

return "Name1"}]]></xp:this.value></xp:label></xp:td>
                        <xp:td>
                            <xp:inputText id="inputText1"
                                value="#{viewScope.Name}">
                            <xp:this.defaultValue><![CDATA[#{javascript:"test"}]]></xp:this.defaultValue></xp:inputText></xp:td>
                    </xp:tr>
                    <xp:tr>
                        <xp:td>
                            <xp:label value="Company" id="label2"></xp:label></xp:td>
                        <xp:td>
                            <xp:inputText id="inputText2"
                                value="#{viewScope.Company}">
                            </xp:inputText></xp:td>
                    </xp:tr>

                </xp:table></xp:div>
        </xp:div>
    </xp:div>
    <xc:standby></xc:standby>
    <xp:eventHandler event="onClientLoad" submit="false">
        <xp:this.script><![CDATA[//increase timeout value for long running XPage requests 

dojo.onLoad(function(){XSP.submitLatency = 600 * 1000; var id =“#{id:LoadWait}”; document.getElementById(id).click()}]]&gt;         

要使代码正常工作,您需要将standby widget code添加到名为“待机”的自定义控件中

答案 2 :(得分:0)

这不是最佳做法,但您可以创建一个XPage(XParent),它只包含一个活动的备用小部件(或任何加载指示符)和一个iframe,它实际上要向用户显示XPage(XChild)。 XParent需要一个名为hideStandby()的JavaScript函数,它允许隐藏备用小部件。然后,您只需将parent.hideStandby()添加到XChild的onClientLoad事件中。使用此设置,当用户访问XParent时,备用窗口小部件立即可见,并且XChild将加载到iframe内的后台。加载完成后,XParent中的备用窗口小部件将在XChild中隐藏。如果跨越整个页面上的iframe(css = position:fixed; width:100%; height:100%; border:none; ...),用户将不知道实际上涉及2个不同的页面。 / p>