呈现的虚假不清楚模型

时间:2011-03-03 22:42:41

标签: java ajax jsf

假设我有五台或更多输入计算机可以影响是否显示单个下拉菜单。我遇到的问题是,如果下拉菜单显示一次(因此通过ajax设置支持bean中的值),然后用户更改其中一个影响输入组件,则下拉菜单的支持bean值当下拉列表使用呈现的属性隐藏时,不会重置。例如:

    <h:selectOneMenu id="sampleDropDown" required="false" immediate="true"
        onchange="jsUpdateSampleDropDownValue()" value="#{backingBean.value}" 
        rendered="#{backingBean.shouldShowSampleDropDown}" 
        actionListener="#{backingBean.listener}" />

我知道我有选择。我一直在争论是否应该添加一个通用的ValueChangeListener(应用请求值阶段)或一个EventHandler(渲染响应阶段)来监听其他输入的值,并决定是否清除下拉菜单值但是这肯定是更多的工作,然后让渲染的财产做出决定。

我们目前在项目中看到过几十个相同类型的问题,我真的希望听取专家关于处理此类情况的最佳实践。如果重要,我们使用自定义ajax(不是ajax4jsf)和jsf 1.1。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我想出的解决方案是不要尝试重置renderered属性的bac​​king bean值中的输入组件。

我有一个连接到单页面界面的阶段监听器,实际上是在javascript方法中传递请求参数(即jsUpdateSampleDropDownValue()),以便可以使用责任链模式在呈现的响应阶段中加载业务逻辑数据。

当一个请求参数传递(即RESET_SAMPLE_DROP_DOWN)onchange与相应的事件处理程序(即ResetSampleDropDownEventHandler)匹配时,我检查一个单独的“约束”类(参见Hardcore Java书),该类验证在清除之前是否累积了足够的数据。绑定值或继续请求。

这允许逻辑集中但附加到多个组件。您可能会问为什么单个JSF ValueChangeListener没有附加到每个允许相同重用的组件。这样做的原因是因为我们的业务逻辑发生在更新模型阶段之后的渲染响应阶段,所以它会在任何“默认”值之后发生任何“重置”类型的方法。