在我的应用程序中,我有以下代码:
<h:form>
<h:panelGrid id="initPanel" columns="3">
<h:outputLabel for="type" value="*Type: " />
<h:selectOneMenu label="type" id="type" value="#{createNews.type}"
required="true" requiredMessage="Type is required.">
<f:ajax render="typePanel" />
<f:selectItem noSelectionOption="true" itemLabel="Choose one..." />
<f:selectItem itemValue="Article" itemLabel="Article" />
<f:selectItem itemValue="Video" itemLabel="Video" />
</h:selectOneMenu>
<p:message for="type" />
<h:outputLabel for="title" value="*Title: " />
<p:inputText label="title" id="title"
value="#{createNews.news.title}"
required="true" requiredMessage="Title is required." />
<p:message for="title" />
</h:panelGrid>
<h:panelGroup id="typePanel">
<h:panelGrid rendered="#{createNews.type == 'Article'}" columns="1">
<h:panelGrid columns="2">
<h:outputLabel for="content" value="*Content: " />
<p:message id="contentMsg" for="content" />
</h:panelGrid>
<p:editor id="content" value="#{createNews.news.content}" width="580" />
</h:panelGrid>
<h:panelGrid rendered="#{createNews.type == 'Video'}" columns="3">
<h:outputLabel for="embedCode" value="*Embed code: " />
<p:inputText label="embedCode" id="embedCode"
value="#{createNews.news.embedCode}" />
<p:message for="embedCode" />
</h:panelGrid>
</h:panelGroup>
<p:commandButton value="Confirm" update="initPanel typePanel" actionListener="#{createNews.createNews}" />
</h:form>
这是托管bean:
@Named(value = "createNews")
@RequestScoped
public class CreateNews {
private Integer type;
private News news;
public void createNews() {...}
// Getters and Setters
}
当我选择Article
或Video
时,相应的部分会在typePanel
中正确呈现。在下面的示例中,我选择了Video
并且呈现了Embed code
部分。
然而,当我点击Confirm
时,先前渲染的部分突然消失。
不知何故,我的托管bean的type
属性没有收到<h:selectOneMenu>
的值。
如果你能给我一个建议,我将非常感激。
致以最诚挚的问候,
答案 0 :(得分:1)
此问题是由以下两个事实引起的:
当您更改下拉列表时,您将创建一个请求范围的bean,其中已设置rendered
属性的正确属性。但是请求范围的bean当然是在请求结束时使用了。当您提交确认按钮时,会创建一个全新的请求范围bean,其所有属性都设置为默认值,由于一般验证失败而未更新,这就是rendered
属性评估回false
的原因。
将bean放在JSF视图范围或CDI会话范围中应该解决它。
另一种方法是将下拉列表绑定到当前视图范围中的UIInput
,并通过UIInput#getValue()
来评估所选值。
<h:selectOneMenu ... binding="#{type}">
...
<h:panelGrid rendered="#{type.value == 'Article'}">
...
<h:panelGrid rendered="#{type.value == 'Embed'}">