当一个元素取决于另一个元素的内容时,渲染2个元素

时间:2014-07-10 13:29:41

标签: ajax jsf-2

我有一个selectOneRadio,有选择" Voice"和"数据"。

然后我有一个selectOneMenu项目"没有数据选项"对于两个项目,然后是其他项目,这取决于所选的单选按钮。

所以,如果我在下拉列表中选择语音,那么#34;没有数据选项"," Office"," Office premium"和#34; Office premium plus",如果我选择Data我有"没有数据选项"," Data start"," Data medum"和"数据溢价"。

我用f:ajax解决了自动下拉内容的变化,效果很好。

现在,如果在下拉菜单中没有数据选项"被选中的警告(下拉菜单附近的小文字)应该出现。

所以我定义了一个outputLabel并根据下拉列表中所选项的值设置了值。

一切正常,直到我更改单选按钮中的选项。 例如: - 页面加载和#34;语音"和"没有数据选项"默认选择,并显示警告标签。 - 我选择" Office"在下拉列表中,警告消失 - 然后我选择"数据&#34 ;;下拉列表会刷新新项目"没有数据选项"被选中但是警告没有出现。

如果我在下拉列表中选择另一个项目,然后返回"没有数据选项"它出现;就在我从" Voice"切换时到"数据" (反之亦然)由于某种原因,渲染不像我期望的那样工作......

这是我的代码;首先是带有对应的ajax的单选按钮,用于呈现下拉列表,然后是带有相应的ajax的下拉列表,用于呈现警告标签,最后是标签,其值取决于下拉列表中的选定项目。

我希望我能够清楚地描述这个问题。如果没有,请问我,我会尝试更精确:)

<h:selectOneRadio id="subscriptionType" value="#{detailModel.afterObject.subscriptionType}">
    <f:selectItems value="#{detailModel.subscriptionTypeValues}" />

    <f:ajax execute="@this" render="dataOptions" />
</h:selectOneRadio>


<h:selectOneMenu id="dataOptions" value="#{detailModel.dataOption}">
    <f:selectItems value="#{detailModel.dataOptionsBySubscriptionType}" var="sdo" itemLabel="#{sdo.dataOptionName}" itemValue="#{sdo}"/>
    <f:converter converterId="ch.ethz.id.cmn.DataOptionConverter" />

    <f:ajax execute="@this" render="noDataOptionChoosenLabel" />
</h:selectOneMenu>


<h:outputLabel id="noDataOptionChoosenLabel"
    value="#{ (detailModel.dataOption == null or detailModel.dataOption.dataOptionName == detailModel.noDataOption) ? msg.subscriptionFormNoDataOptionChoosen : ''}"
    style="font-style: italic; font-size:9px; color:red;"/>

1 个答案:

答案 0 :(得分:1)

我认为你期望ajax事件能够传播&#34;传播&#34;通过组件,这将是不错的,但它确实像这样工作。您必须手动更新和重置它们。

所以在顶层(收音机)你必须重置detailModel.dataOption并渲染其他两个组件:

<f:ajax listener="#{detailModel.resetDataOption}"
        render="dataOptions noDataOptionChoosenLabel" 
        />

(你可以省略execute =&#34; @ this&#34;因为它是默认的)

public void resetDataOption(AjaxBehaviorEvent event) {
    dataOption=null;
}