2014-03-01 77 views
0

這是之前發佈的後續操作。我能夠將它隔離到儘可能簡單的情況。 在我正在處理的應用程序中,我想根據在用戶打開文檔時可能會更改的applicationScope變量的值執行條件部分刷新。我無法得到它的工作,因爲看起來partialRefresh目標只在pageLoad事件上被評估,而不是在調用partialRefresh時動態地評估。爲了演示這一點,我創建了一個小測試XPage,在True和False之間切換viewScope變量,而不更新。然後是一個具有partialRefresh公式的按鈕,該公式指定是否刷新panelTrue或panelFalse。默認情況下,當文檔第一次打開時,它會刷新並顯示panelFalse,因爲vsIsTrue爲null並被解釋爲False。如果我將vsISTrue切換爲True,然後單擊部分刷新按鈕,您將看到panelFalse是刷新的面板,而不是panelTrue。我在部分刷新的公式中添加註釋,部分刷新公式在每次刷新時執行並返回正確的過程,但是它絕不會將面板更改爲實際刷新爲panelTrue。有條件部分刷新

所以我想我的問題是 - 有沒有不同的方式來完成?因爲我看不到如何。我已經包括下面的源 - 請注意我用的調試工具欄,所以你可能需要刪除dbBar引用:

<?xml version="1.0" encoding="UTF-8"?> 

    <xp:view xmlns:xp="http://www.ibm.com/xsp/core" 
     xmlns:xc="http://www.ibm.com/xsp/custom"> 
     <xc:ccDebugToolbar defaultCollapsed="false" collapseTo="left"></xc:ccDebugToolbar> 
     <xp:br></xp:br> 
     <xp:br></xp:br> 
     <xp:button id="SetViewScope" value="Toggle View Scope"> 
      <xp:eventHandler event="onclick" submit="true" refreshMode="norefresh"> 
       <xp:this.action><![CDATA[#{javascript:(viewScope.get("vsIsTrue")) ? viewScope.put("vsIsTrue",false) : viewScope.put("vsIsTrue",true)}]]></xp:this.action> 
      </xp:eventHandler> 
     </xp:button> 
     <xp:button value="Partial Refresh" id="PartialRefresh"> 
      <xp:eventHandler event="onclick" submit="true" refreshMode="partial" 
       refreshId='#{javascript:if (viewScope.get("vsIsTrue")){ 
     dBar.info("Refesh panelTrue"); 
     return "panelTrue"; 
     break; 
    }else { 
     dBar.info("Refresh panelFalse"); 
     return "panelFalse"; 
     break; 
    }}'> 
      </xp:eventHandler> 
     </xp:button> 
     <xp:panel id="panelTrue"> 
      This is panelTrue - viewScope(vsIsTrue) = 
      <xp:text escape="true" id="computedField1" value="#{viewScope.vsIsTrue}"></xp:text> 
     </xp:panel> 
     <xp:panel id="panelFalse"> 
      This is panelFalse - viewScope(vsIsTrue;) = 
      <xp:text escape="true" id="computedField2" value="#{viewScope.vsIsTrue}"></xp:text> 
     </xp:panel> 
    </xp:view> 
+0

只是要清楚,你想防止在一定條件下刷新,還是你想改變*其*內容被刷新?在你之前的問題上,你的目標看起來像是前者,但在這個問題上你似乎在嘗試後者。 –

+0

ExtLib是一個選項嗎?開關組件應該有幫助。 –

+0

@Tim - 我想改變目標。範圍變量發生變化時。它實際上會更像是如果vsIsTrue = true,然後進行部分刷新,否則不會做任何更新。 –

回答

5

要做到這一點,你必須更新客戶端的數據。如果你改變了按鈕的代碼,問題應該得到解決:

<xp:button id="SetViewScope" value="Toggle View Scope"> 
    <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="PartialRefresh"> 
     <xp:this.action> 
      <![CDATA[#{javascript:(viewScope.get("vsIsTrue")) ? viewScope.put("vsIsTrue",false) : viewScope.put("vsIsTrue",true)}]]> 
     </xp:this.action> 
    </xp:eventHandler> 
</xp:button> 

正如你所看到的,事件處理程序與PartialRefresh(在refreshMode設置爲部分的ID現在更新按鈕)。當點擊切換視圖範圍時,CSJS DOM元素將重新加載最新代碼。下次單擊按鈕並觸發部分刷新時,客戶端會將正確的ID發送到服務器。

編輯:

另一種方式是做同樣的伎倆與CSJS腳本塊:

<xp:div id="refreshMe"> 
    <xp:scriptBlock id="scriptBlockRefresh"> 
     <xp:this.value> 
      <![CDATA[ 
       var idPanelTrue = '#{id:panelTrue}'; 
       var idPanelFalse = '#{id:panelFalse}'; 
       var vsIsTrue = #{javascript:viewScope.get('vsIsTrue')}; 
       XSP.allowSubmit(); 
       var id = vsIsTrue?idPanelTrue:idPanelFalse; 
       XSP.partialRefreshPost(id,{}); 
      ]]> 
     </xp:this.value> 
    </xp:scriptBlock> 
</xp:div> 

相反刷新的元素,你刷新CSJS sciptblock然後更新正確XPage元素。在這種情況下,局部刷新按鈕有看起來像這樣:

<xp:button value="Partial Refresh" id="PartialRefresh"> 
    <xp:eventHandler event="onclick" submit="true" refreshMode="partial" 
     refreshId='refreshMe'> 
    </xp:eventHandler> 
</xp:button> 
+0

謝謝我喜歡第二個選項,它看起來會完成這項工作。 真的很感謝幫助和分享的意願。 –

+0

工程就像一個魅力,非常感謝你! –