2012-12-11 115 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属性将被重新计算。