我有一个h:selectOneMenu,当它的值变为特定值(比如“2”)时,它会假设显示隐藏的字段(尚未呈现)。注意到它们与托管bean中属性的相同值相关联。
<h:outputText value="Function:"></h:outputText>
<h:selectOneMenu id="funDrp" converter="FunctionConv" value="#{cardBean.card.functionId}">
<f:selectItems value="#{commonData.functions}" var="c" itemLabel="#{c.description}" itemValue="#{c.functionId}" />
<f:ajax render="@form" execute="@form" event="valueChange" />
</h:selectOneMenu>
<h:outputText value=" Profile Id:" rendered="#{(cardBean.card.functionId.functionId==2)}"></h:outputText>
<h:inputText id="card_refillProfileId"rendered="#{(cardBean.card.functionId.functionId==2)}" label="Refill Profile Id" required="true" value="#{cardBean.card.refillProfileId}"></h:inputText>
<h:outputText value="Origin Type:" rendered="#{(cardBean.card.functionId.functionId==2)}"></h:outputText>
<h:inputText id="card_originType" rendered="#{(cardBean.card.functionId.functionId==2)}" label="Origin Node Type" required="true" value="#{cardBean.card.originType}"></h:inputText>
如果将“card”对象分配给现有实体,它们可以正常工作,但如果它是新实体 - 它不会按预期工作。
答案 0 :(得分:0)
这是一种完全预期的行为。使用<f:ajax>
,您可以重新呈现DOM中存在的HTML元素,但是通过在JSF组件中指定rendered="false"
,它们将不会出现在您的DOM中。并且,由于ajax需要通过其id找到元素,并在之后替换它,这项工作显然无法完成。
但是,您的工作可以通过在容器中包含您的组件(所有这些都使用rendered
属性)来处理,例如在<h:panelGroup id="to-be-rerendered">
中,它总是被渲染,但是它的孩子 - 不。因此,如果符合条件,ajax将能够重新呈现面板,其中包含rendered="true"
的所有组件,并且它们将显示在您的视图中。
作为旁注,如果您的视图/表单增长,您的ajax行为可能会非常昂贵。因此,如果您只想重新呈现某些组件,请在<f:ajax>
标记中指定它:<f:ajax render="to-be-rerendered" />
(要呈现的组件的空格分隔ID列表)。
答案 1 :(得分:0)
问题是附加到select one菜单的值是null“card.functionId”。所以在检查之前初始化它。我在构造bean之前尝试初始化它但它没有帮助。
为此,初始化是通过为selectOneMenu附加“ValueChangeListener”来完成的
<h:selectOneMenu id="funDrp" converter="FunctionConv" valueChangeListener="# {cardBean.changeCardFunc}"
value="#{cardBean.card.functionId}">
<f:selectItems value="#{commonData.functions}" var="c"
itemLabel="#{c.description}" itemValue="#{c.functionId}" />
<f:ajax render="@form" execute="funDrp" event="change" />
</h:selectOneMenu>
并在Managed Bean中:
public void changeCardFunc(ValueChangeEvent e) {
// object newFunc= e.
if(card!=null){
card.setFunctionId((Function)e.getNewValue());
}else {
card= new Card();
card.setFunctionId((Function)e.getNewValue());
System.err.println(e.getNewValue());
}
}
答案 2 :(得分:-1)
试
<f:ajax render="card_refillProfileId card_originType" execute="@form" event="valueChange" />
答案 3 :(得分:-1)
您
<f:ajax render="@form" execute="@form" event="valueChange" />
应该是(事件可以省略)
<f:ajax render="@form" execute="@form" event="change" />
似乎selectOneMenu.value,您的转换器和渲染的EL之间存在不匹配。
有两次functionId.functionId
。 selectOneMenu.value
绑定到cardBean.card.functionId
。如果functionId
是一个函数,我可能会错。