2011-03-03 55 views
0

比方说,我有五个或更多的输入计算机,可能会影响是否显示一个下拉菜单。我遇到的问题是,如果下拉菜单显示一次(因此通过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。任何帮助表示赞赏。

回答

0

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

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

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

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