2013-02-14 69 views
2

我的自定義控件由面板中的多個組合框和文本輸入框組成。組合框值相互依賴,所以當組合框更改時,將在面板上執行局部刷新以刷新其他組合框的值。部分刷新面板中有條件隱藏的編輯框

其中一個文本輸入框也取決於其中一個組合框 - 假設組合框標題是「您有特殊要求嗎?」值爲「是」和「否」。如果值爲「否」,則隱藏special_requirements文本框,並在querySaveDocument事件中將其保存爲「N/A」到文檔。如果值爲「是」,則顯示special_requirements文本框,用戶必須填寫它們,並保存它們的輸入。

我一直有的問題是,如果我計算文本框的「可見」屬性的值,那麼它會適當地顯示/隱藏,但任何用戶輸入都會在面板刷新時被清除 - 例如用戶選擇「是」,輸入一些文本,然後更改導致局部刷新的另一個組合框 - 文本框仍然顯示,但現在是空的。

目前我正在使用替代計算「Visible」屬性的替代方法,計算CSS樣式,將其設置爲不需要文本框時隱藏。但是,這意味着用戶可以輸入它,儘管在組合框中選擇了「否」,所以它不是理想的解決方案。是否有辦法在刷新之間保留用戶以前的輸入,並且如果使用「可見」屬性將組合框選項從「是」更改爲「否」,則將其刪除?

+2

你能發佈一些示例代碼? - 分析問題會更容易 – 2013-02-14 12:43:03

回答

6

假設Naveens例子是像你一樣的問題,你有JSF生命週期一個簡單的問題:如果一個組件的更新模型階段中是不可見的,提交的內容不被應用和丟失。

只要改變色性這樣:

<xp:this.rendered> 
    <![CDATA[#{javascript: 
     if(view.isRenderingPhase()){ 
     return getComponent("comboBox1").getValue() == "Yes" 
     }else{ 
     return true; 
     } 
    }]]> 
</xp:this.rendered> 
+0

謝謝Sven!這工作。 – Naveen 2013-02-14 16:32:43

+0

輝煌,謝謝。 – 2013-02-14 21:31:42

+0

謝謝,工作正常 – 2015-03-18 10:48:18

1

我曾經遇到過類似的問題,並且我認爲你面對同樣的問題。這是我發現的。

讓我們說在你的面板中你有組合框,然後編輯框(順序是重要的)與編輯框的可見性取決於組合框的值。當你改變組合框的值時,編輯框可見或隱藏,但其值被清除(參見下面的代碼片段)。

<xp:panel id="panel1"> 
    <xp:comboBox id="comboBox1"> 
     <xp:selectItem itemLabel="No" itemValue="No"></xp:selectItem> 
     <xp:selectItem itemLabel="Yes" itemValue="Yes"></xp:selectItem> 
     <xp:eventHandler event="onchange" submit="true" 
      refreshMode="partial" refreshId="panel1"> 
     </xp:eventHandler> 
    </xp:comboBox> 
    <xp:inputText id="inputText1"> 
     <xp:this.rendered><![CDATA[#{javascript:getComponent("comboBox1").getValue() == "Yes"}]]></xp:this.rendered> 
    </xp:inputText> 
</xp:panel> 

但是,如果我換了兩個組件,使我們擁有編輯框,然後組合框(記住,順序很重要),然後改變組合框的值,在編輯框中的值時,編輯恢復框再次可見(請參閱下面的代碼片段)。

<xp:panel id="panel1"> 
    <xp:inputText id="inputText1"> 
     <xp:this.rendered><![CDATA[#{javascript:getComponent("comboBox1").getValue() == "Yes"}]]></xp:this.rendered> 
    </xp:inputText> 
    <xp:comboBox id="comboBox1"> 
     <xp:selectItem itemLabel="No" itemValue="No"></xp:selectItem> 
     <xp:selectItem itemLabel="Yes" itemValue="Yes"></xp:selectItem> 
     <xp:eventHandler event="onchange" submit="true" 
      refreshMode="partial" refreshId="panel1"> 
     </xp:eventHandler> 
    </xp:comboBox> 
</xp:panel> 

它似乎是部分刷新觸發組件提交之前組件中的值,而其他組件則不提供。關於這種行爲的原因,我有沒有的想法!我真的很喜歡,如果有人能夠對此有所瞭解,因爲這已經讓我重新設計了我的XPage很多次了!

+0

看看我對這個問題的回答。這是JSF生命週期的一個問題:* comboBox *在* inputText *之前獲得值* yes *。在提交的值更新之前,將檢查* inputText *組件的* rendered *屬性:它是錯誤的,因爲* comboBox *值是* yes *,並且* inputText *的新值會丟失。如果* inputText *在* comboBox *之前,則呈現的屬性爲true,並更新提交的值。 – 2013-02-14 15:24:09