2013-04-11 45 views
1

我想從客戶端JavaScript中設置一個XPages範圍變量。我有一個XPage,其中包含使用Dojo顯示或隱藏的幾個部分。在這個XPage中,我有一個執行某些服務器端JavaScript的按鈕。一旦按鈕後面的SSJS執行,默認情況下可見的XPage部分將再次可見,而不是在點擊按鈕之前立即可見的部分。我希望點擊按鈕之前可見的部分在按鈕後面的SSJS執行後也可見。xpages - 如何從客戶端JavaScript設置範圍變量?

要做到這一點,我想過使用範圍變量 - 使用客戶端JavaScript來計算當前可見的XPage的哪一部分,將該值設置爲範圍變量,並在onClientLoad事件中讀取範圍變量XPage再次使此部分可見(並隱藏所有其他部分)。 但是,我沒有找到從客戶端JavaScript設置範圍變量的方法。我曾嘗試加入

var xyz = "#{javascript:viewScope.put('sectionDisplay','Section')}" 

到按鈕的onClick客戶端事件,但不管按鈕是否被點擊或沒有這臺範圍變量。

在XPages之前,我會使用querystring將變量從一個頁面傳遞到另一個頁面。我現在該怎麼做?

回答

1

另一種方法:或許你根本不需要scope變量,如果你只是想隱藏某些東西,你可以將它的style屬性設置爲「display:none」。

例如,你有這個div:<xp:div id="mydiv">...</xp:div>

然後你可以用下面的CSJS在一個按鈕:

dojo.byId("#{id:mydiv}").style.display="none"

+1

是的,我使用dojo cookie解決了這個問題,而不是範圍變量。在我的XPage中,我有幾個Dojo內容窗格,其中只有一個是可見的。現在,當我使用dojo顯示dojo內容窗格時,我使用dojo.cookie存儲了窗格的名稱。當XPages在按鈕後面的SSJS執行後重新加載時,我使用XPage的onClientLoad事件中的dojo.cookie來確定應該顯示哪個Dojo內容窗格。 – 2013-04-11 13:48:20

+0

@TonyGuiheen嗯,有趣的想法:-)餅乾在SSJS中可用作餅圖。 – 2013-04-16 21:18:23

6

你不能這樣設置CSJS變量:如果你將這個代碼添加到你的CSJS中,它將在發送到瀏覽器之前計算。這就是爲什麼變量被設置而不管點擊按鈕的原因。

但是你可以添加一些SSJS代碼到你的按鈕來設置viewScope變量。您可以在此描述與參數從瀏覽器發送的值:http://xpageswiki.com/web/youatnotes/wiki-xpages.nsf/dx/Work_with_events_and_partial_or_full_refresh#Run+a+partial+update+from+client+javascript

編輯:

您可以在SSJS的PARAM對象訪問不同的參數。 F.E.如果添加參數在CSJS ...

XSP.partialRefreshGet(id, { 
    params: { 'value': 'some string'} 
}); 

...你可以訪問參數SSJS這樣的:

param.get("value"); 
5

取決於你的使用情況。如果你想與部分/完全刷新設置,你可以簡單地把隱藏編輯成XP,將其綁定到anyScope.variable_name並設置其與CSJS值:

var field = document.getElementById("#{id:hiddenInput1}"); 
    field.value = "new Value"; 

每次刷新會提交其價值進行建模和會在範圍變量中可用。

另一種選擇是在SSJS的任何位置使用事件處理程序根據隱藏的輸入值或提交的值設置作用域變量,如Sven的答案中所述。

+0

只是爲了提醒您:只適用於表單的編輯模式。隱藏輸入在讀取模式下呈現爲「span」,並且未提交任何值。要解決此問題,請將隱藏的輸入置於其屬性爲'readOnly = false'的Panel組件中。 – 2016-06-29 13:42:29

1
XSP.partialRefreshGet(id, { 
    params: { 'value': 'some string'} 
}); 

... you can access the parameter in SSJS like this: 

param.get("value"); 

我傳遞一個UNID從網格到對話框。我可以得到param.get('unid'),但我無法將它設置爲文檔數據源單一。以便這些字段將填充來自後端文檔的值。有很多字段,所以我想以某種方式填充該數據源,而不必在每個字段中寫入值。 如何獲取文檔數據源以識別param.unid?正如你所描述的那樣,我正在嘗試隱藏輸入,但是該值並未提交。 這可能嗎?

XSP.partialRefreshGet(dialogId, 
{ 
    params: xspParams, 
    onStart: function(){ 
     //dojo.style(loadingGifId,'display','block'); 
     XSP.getElementById("#{id:inputText1}").innerHTML = unid; //not working 
     XSP.getElementById("#{id:inputText1}").value = unid; //not working either 
    }, 
    onComplete: function(){ 
     dijit.byId(dialogId).show(); 
     //dojo.style(loadingGifId,'display','none');  
}}); 


<xp:panel id="dialog"> 
    <input id="inputText1" 
     value="#{javascript:sessionScope.personUNID;}"> 
    </input> 

    <xp:this.data> 
     <xp:dominoDocument var="docPerson" action="editDocument" 
      formName="fUserName"> 
      <xp:this.documentId><![CDATA[#{javascript:sessionScope.personUNID ;}]]></xp:this.documentId> 
     </xp:dominoDocument> 
    </xp:this.data> 

    <xp:inputText id="cfParams" 
     value="#{javascript:param.get('unid');}"> 
    </xp:inputText> 
</xp:panel>