2013-02-11 42 views
2

我有以下測試XPage。XSP.showDialog在onStart事件中不起作用?

<?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」,但仍然一樣。

+0

'refreshId =「button1」''怎麼樣? – 2013-02-11 14:01:26

+0

不做任何事情。我已將onStart,onComplete更改爲alert('test');這是有效的。 – Herty 2013-02-11 14:21:22

+0

我不認爲這與你的代理'runLongTime'有任何關係。如果我評論代理程序代碼並調用一個簡單的'print'方法,那麼即使我無法打開對話框。我在「XSP.openDialog」之後在我的頁面的源代碼中使用了簡單的'alert'(使用Google Chrome開發人員工具),我可以看到出現對話框的'div'標籤,但是在我的警報上單擊確定後它會消失框。 – Naveen 2013-02-11 14:49:43

回答

6

XSP.openDialog()XSP.closeDialog()每個都會觸發部分刷新。 XPage客戶端API包含用於防止多個局部刷新操作並行執行的邏輯,這可能會阻止顯示對話框,因爲在嘗試運行刷新以顯示對話框時,它已經在運行按鈕事件。

在頁面中添加一個JSON-RPC(在控制面板中稱爲「遠程服務」)。將您的按鈕的服務器事件代碼移動到RPC的方法。然後,您可以將按鈕事件更改爲純粹的客戶端:調用XSP.openDialog(),然後調用RPC方法並關閉該方法的onComplete中的對話框。這應該可以防止您目前遇到的競爭狀況。

+0

我永遠不會理解爲什麼局部刷新不能並行運行......在我的應用程序中,我只是重置了allowSubmit標誌,並且一切正常,沒有任何問題。 – 2013-02-11 15:34:07

+0

謝謝。這種回答我的問題。它在Web中工作,但XPiNC似乎可以工作和關閉。我將close放在addCallback()函數中。 – Herty 2013-02-11 15:41:23

+0

標記爲答案。如果我不明白爲什麼XPiNC不能正常工作,我會提出另一個問題。非常感謝你的幫助! – Herty 2013-02-11 16:07:11

0

據我在這裏可以看到,你正試圖打開/關閉同一個對話框。 幾天前,我得到了同樣的問題,並想知道爲什麼這不起作用。

最後,我檢查了事件,並以onStart和onComplete幾乎平行發射的壯觀結果結束。

也許你可以嘗試在調用XSP.closeDialog事件之前插入一個超時(window.timeout)。