h:当改变h:selectOneMenu值时,inputText没有被重新渲染,不能按预期工作

时间:2013-02-21 09:11:42

标签: jsf-2 rendering show-hide

我有一个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”对象分配给现有实体,它们可以正常工作,但如果它是新实体 - 它不会按预期工作。

4 个答案:

答案 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.functionIdselectOneMenu.value绑定到cardBean.card.functionId。如果functionId是一个函数,我可能会错。