2012-12-11 117 views
1

我有以下GUI元素:一個下拉菜單,用於選擇您要自己輸入文本還是要從預定義文本中進行選擇。JSF呈現條件

<h:form id="test"> 
<div> 
    <h:outputLabel value="Please select:" /> 
    <h:selectOneMenu value="#{myform.selection}"> 
    <f:selectItem itemValue="1" itemLabel="Input text" /> 
    <f:selectItem itemValue="2" itemLabel="Select from predefined texts" /> 
    </h:selectOneMenu> 
</div> 
<div> 
    <h:outputLabel value="Your text: " /> 
    <h:inputText value="#{myform.inputText}" rendered="#{myform.selection == 1}" /> 
    <h:selectOneMenu value="#{myform.inputText}" rendered="#{myform.selection == 2}"> 
    <f:selectItem itemValue="11" itemLabel="Preselected text 1" /> 
    <f:selectItem itemValue="22" itemLabel="Preselected text 2" /> 
    </h:selectOneMenu> 
</div> 
</h:form> 

如何對呈現的條件進行編程?

更新:當窗體加載時,1已被選中,所以inputText被渲染。問題是,當我將選擇更改爲2時,沒有任何反應。我們使用基於JSF 1.2的已修改JSF庫。

+0

'rendered'條件是正確的,但你需要使用'a4j'使組件顯示/ dissapear當用戶選擇從第一'selectOneMenu'的值。你正在使用哪個版本的JSF? – jmrodrigg

+0

我想我也可以使用JavaScript。 h:selectOneMenu有沒有onclick? – user1414745

+0

JavaScript在客戶端執行......我想說,使用JavaScript更改JSF屬性是不可能的。 – jmrodrigg

回答

2

如果您不喜歡使用a4j庫,您可以通過使用javascript下面的show/hide組件。 onchange事件,你的第一個selectOneMenu

<h:selectOneMenu value="#{myform.selection}" onchange="myFunction(this.value)"> 

添加Id S添加到您textBoxselectOneMenu如下。

<h:inputText value="#{myform.inputText}" rendered="#{myform.selection == 1}" id="myText"/> 
<h:selectOneMenu value="#{myform.inputText}" rendered="#{myform.selection == 2}" id="mySelectMenu"> 

最後你的javascript函數應該如下。

<script> 
    function myFunction(selection) { 
     if(selection == 1) { 
      document.getElementById("test:myText").style.display = ""; 
      document.getElementById("test:mySelectMenu").style.display = "none"; 
     } else { 
      document.getElementById("test:myText").style.display = "none"; 
      document.getElementById("test:mySelectMenu").style.display = ""; 
     } 
    } 
</script> 
+1

你想用'style =「display:none」'替換'rendered =「false」',否則客戶端根本沒有HTML表示。 – BalusC

+0

是的,這有幫助。我最大的問題是獲取選擇下拉列表的內容 - 我不知道this.value;) – user1414745

0

如果您沒有任何限制,我建議使用a4j來添加AJAX功能。當您使用JSF 1.2,則需要使用RichFaces 3.3.X庫和在JSF文件中添加這個標籤:

<h:form id="test"> 
<div> 
    <h:outputLabel value="Please select:" /> 
    <h:selectOneMenu value="#{myform.selection}"> 
    <f:selectItem itemValue="1" itemLabel="Input text" /> 
    <f:selectItem itemValue="2" itemLabel="Select from predefined texts" /> 
    <a4j:support event="onchange" reRender="textSection" ajaxSingle="true"/> 
    </h:selectOneMenu> 
</div> 
<div> 
    <h:outputLabel value="Your text: " /> 
    <a4j:outputPanel id="textSection"> 
     <h:inputText value="#{myform.inputText}" rendered="#{myform.selection == 1}" /> 
     <h:selectOneMenu value="#{myform.inputText}" rendered="#{myform.selection == 2}"> 
     <f:selectItem itemValue="11" itemLabel="Preselected text 1" /> 
     <f:selectItem itemValue="22" itemLabel="Preselected text 2" /> 
     </h:selectOneMenu> 
    </a4j:outputPanel> 
</div> 
</h:form> 

當:

<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%> 

,然後使用a4j:support這樣修改代碼用戶將選擇從selecOneMenu中更改,a4j:outputPanel現在包裝要顯示/隱藏的組件將被重新編輯,並且rendered屬性將被重新計算。