2014-09-18 99 views
0

這是一個高級別問題,但確實有特定答案。如何在XPages中的單個按鈕後面執行多個頁面更新

我有一個需求,我需要兩次執行操作,並在第二次嘗試操作之前用消息更新用戶。我也想在第一個動作之前更新用戶。

這裏是事件的時間線/序列:

  1. 用戶按下按鈕
  2. 顯示信息
  3. 執行操作
  4. 如果成功,顯示「操作成功」的「開始操作」中,如果操作失敗 顯示「操作失敗 - 重試」
  5. 重試操作
  6. 如果成功ul,顯示「操作成功」,如果操作失敗顯示「請稍後再試」。

當我在java方法中編寫這個代碼時,唯一顯示的是最終的消息。我嘗試使用Thread.sleep(1500);給消息一個機會顯示,但只有最終的消息將永遠顯示。

然後我試着用SSJS來完成這個任務,但結果是一樣的。我想我明白爲什麼會發生這種情況。

我的問題是:是否有可能做這樣的多個部分刷新。我可以採取什麼最好的方法來實現這一要求。任何人都可以想到哪些解決方法或黑客行爲。

+0

感謝您的回答。我參與了多個項目,所以我最終會得到這個工作並接受最好的答案。 – 2014-09-22 11:18:43

回答

3

如果你想只是嘗試了兩次,你可以創建一個RPC控制,你想要的功能,然後用回調

var deferred = service.doSomethingCool(); 
    deferred.addCallback(function(data) { 
    if (data.status == 'error') { 
     //set UI Label Fail 
     var insideDeferred = service.doSomethingCool(); 
     insideDeferred.addCallback(function(data) { 
     if (data.status == 'error') { 
      //set UI Label Fail 
     } 
     else { 
      //set UI Label Success 
     } 
    } 
    } 
} 

此調用它應該爲你工作假設你有一個叫做「doSomethingCool」的名爲服務和方法的RPC控件

+0

謝謝一噸託比!我幾乎按照我想要使用此解決方案的方式工作。 – 2014-09-22 18:35:40

1

我嘗試過一次Mark的帖子進度條。 http://linqed.eu/?p=174沒有得到它的工作,但沒有深入努力。解決方案可能在那裏。

你想要的東西當然應該是可行的。至少我會認爲你使用CSJS來做真正的繁重工作。 CSJS可能通過RPC或XAgent調用SSJS,並完成第一條和第二條消息的所有工作。

我只是簡單介紹了實際工作的細節。 :)

1

是的,這是可能的。我們可以通過點擊一次按鈕來反覆執行客戶端和服務器端操作n次。

  1. 創建一個帶CSJS代碼的按鈕以提醒。
  2. 爲您的操作編寫SSJS代碼。
  3. 現在的訣竅取決於您的操作是部分刷新還是完全刷新。

如果部分刷新,請使用eventhandler中的oncomplete/onfailure事件編寫CSJS代碼以執行按鈕單擊操作。使用隱藏的輸入字段來存儲重試次數並確定重試必須停止的次數。

如果完全刷新,oncomplete事件不會觸發。在客戶端加載事件中寫入您的CSJS代碼。在這種情況下,創建一個隱藏的輸入字段並將其綁定到視圖範圍變量。用它來存儲SSJS代碼中的成功或失敗,並檢索CSJS代碼中的值來檢查和重試。

我已經包含了一個帶有按鈕的示例代碼,但它可以用許多不同的方式實現。

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"> 
    <xp:button value="Label" id="button1"> 
     <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="label1"> 
      <xp:this.script><![CDATA[alert("operation starting");]]></xp:this.script> 
      <xp:this.action><![CDATA[#{javascript:viewScope.status = "first operation completed"; 
print(getComponent("fail").getValue());}]]></xp:this.action> 
      <xp:this.onComplete><![CDATA[alert("first operation completed. starting second"); 
document.getElementById("#{id:ihRetry}").value = "False"; 
document.getElementById("#{id:button2}").click();]]></xp:this.onComplete> 
      <xp:this.onError><![CDATA[if (document.getElementById("#{id:ihRetry}").value == "False") { 
    alert("first operation failed. retry again"); 
    document.getElementById("#{id:ihRetry}").value = "True"; 
    document.getElementById("#{id:button1}").click(); 
} else { 
    alert("first operation failed again. starting second"); 
    document.getElementById("#{id:ihRetry}").value = "False"; 
    document.getElementById("#{id:button2}").click(); 
}]]></xp:this.onError> 
     </xp:eventHandler> 
    </xp:button> 
    <xp:button value="Label" id="button2" style="display:none"> 
     <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="label1"> 
      <xp:this.action><![CDATA[#{javascript:viewScope.status = "second operation completed";}]]></xp:this.action> 
      <xp:this.onComplete><![CDATA[alert("second operation completed. starting third"); 
document.getElementById("#{id:ihRetry}").value = "False"; 
document.getElementById("#{id:button3}").click();]]></xp:this.onComplete> 
      <xp:this.onError><![CDATA[if (document.getElementById("#{id:ihRetry}").value == "False") { 
    alert("second operation failed. retry again"); 
    document.getElementById("#{id:ihRetry}").value = "True"; 
    document.getElementById("#{id:button2}").click(); 
} else { 
    alert("second operation failed again. starting third"); 
    document.getElementById("#{id:ihRetry}").value = "False"; 
    document.getElementById("#{id:button3}").click(); 
}]]></xp:this.onError> 
     </xp:eventHandler> 
    </xp:button> 
    <xp:button value="Label" id="button3" style="display:none"> 
     <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="label1"> 
      <xp:this.action><![CDATA[#{javascript:viewScope.status = "third operation completed";}]]></xp:this.action> 
      <xp:this.onComplete><![CDATA[alert("third operation completed."); 
document.getElementById("#{id:ihRetry}").value = "False";]]></xp:this.onComplete> 
      <xp:this.onError><![CDATA[if (document.getElementById("#{id:ihRetry}").value == "False") { 
    alert("third operation failed. retry again"); 
    document.getElementById("#{id:ihRetry}").value = "True"; 
    document.getElementById("#{id:button3}").click(); 
} else { 
    alert("third operation failed again. end"); 
    document.getElementById("#{id:ihRetry}").value = "False"; 
}]]></xp:this.onError> 
     </xp:eventHandler> 
    </xp:button> 
    <xp:inputHidden id="ihRetry"> 
     <xp:this.value><![CDATA["False"]]></xp:this.value> 
    </xp:inputHidden> 
    <xp:label value="#{viewScope.status}" id="label1"></xp:label> 
</xp:view> 
+0

你不會碰巧有一個使用局部刷新的代碼示例。 – 2014-09-22 12:02:30

+0

用示例代碼更新了我的答案。 ssjs代碼print(getComponent(「fail」)。getValue());是爲了使操作失敗。您也可以將ihRetry的邏輯更改爲具有n而不是true或false來進行n次重試。 – 2014-09-23 10:53:13

+0

感謝您的代碼示例。我沒有使用提醒,而是更新後臺的字段。 – 2014-09-23 16:18:33

相關問題