0

我有 ah: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>

如果将“卡片”对象分配给现有实体,它们可以正常工作,但如果它是新实体 - 它不会按预期工作。

4

4 回答 4

0

这是完全预期的行为。使用<f:ajax>您可以重新呈现存在于您的 DOM 中的 HTML 元素,但通过rendered="false"在您的 JSF 组件中指定它们不会出现在您的 DOM 中。而且,由于 ajax 需要通过它的 id找到元素,然后替换它,这个工作显然无法完成。

但是,您的工作可以通过rendered在容器中包含您的组件(所有组件都使用该属性)来处理,例如 in <h:panelGroup id="to-be-rerendered">,它总是被渲染,但它的孩子 - 不是。rendered="true"因此,如果满足条件,ajax 将能够重新渲染包含所有组件的面板,并且它们将出现在您的视图中。

作为旁注,如果您的视图/表单增长,您的 ajax 行为可能会非常昂贵。因此,如果您只想重新渲染某些组件,请在您的<f:ajax>标签中指定它:(<f:ajax render="to-be-rerendered" />要渲染的组件的空格分隔 ID 列表)。

于 2013-02-21T11:58:15.760 回答
0

问题是附加到选择一个菜单的值是空的“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>

在托管 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());
    }
}
于 2013-02-21T23:13:14.907 回答
-1

尝试

<f:ajax render="card_refillProfileId card_originType" execute="@form" event="valueChange" />
于 2013-02-21T09:40:20.280 回答
-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如果是一个函数,我可能是错的。

于 2013-02-21T09:45:22.617 回答