我有一个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;"/>
答案 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;
}