Java 渲染为false不会清除模型
假设我有五台或更多的输入计算机,它们可以影响是否显示单个下拉菜单。我遇到的问题是,如果下拉菜单显示一次(从而通过ajax设置backingbean中的值),然后用户更改一个影响输入组件,那么当下拉菜单使用呈现属性隐藏时,下拉菜单的backingbean值不会被重置。例如:Java 渲染为false不会清除模型,java,ajax,jsf,Java,Ajax,Jsf,假设我有五台或更多的输入计算机,它们可以影响是否显示单个下拉菜单。我遇到的问题是,如果下拉菜单显示一次(从而通过ajax设置backingbean中的值),然后用户更改一个影响输入组件,那么当下拉菜单使用呈现属性隐藏时,下拉菜单的backingbean值不会被重置。例如: <h:selectOneMenu id="sampleDropDown" required="false" immediate="true" onchange="jsUpdateSampleDro
<h:selectOneMenu id="sampleDropDown" required="false" immediate="true"
onchange="jsUpdateSampleDropDownValue()" value="#{backingBean.value}"
rendered="#{backingBean.shouldShowSampleDropDown}"
actionListener="#{backingBean.listener}" />
我知道我在这里有选择。我已经讨论过应该添加一个通用的ValueChangeListener(应用请求值阶段)还是一个EventHandler(呈现响应阶段)这将侦听其他输入的值,并决定是否清除下拉菜单值,但这肯定比仅让渲染属性做出该决定需要更多的工作
我们在我目前参与的项目中看到了几十个类似的问题,我真的很想听听专家们关于处理这种情况的最佳实践。如果有必要,我们将使用自定义ajax(而不是ajax4jsf)和JSF1.1。非常感谢您的帮助。我提出的解决方案是不要尝试在renderered属性的backingbean值中重置输入组件 我有一个阶段监听器连接到单页接口,基本上是在javascript方法中传递请求参数(即jsUpdateSampleDropDownValue()),以便可以使用责任链模式在呈现的响应阶段加载业务逻辑数据 当在与相应的事件处理程序(即ResetSampleDropDownEventHandler)匹配的更改中传递请求参数(即ResetSampleDropDownEventHandler)时,我会检查一个单独的“constraint”类(请参阅核心Java书籍),该类在清除绑定值或继续请求之前验证是否积累了足够的数据 这使得逻辑可以集中化,但也可以连接到多个组件。您可能会问,为什么没有将一个JSF ValueChangeListener附加到每个组件上,从而允许相同的重用。这是因为我们的业务逻辑发生在更新模型阶段之后的呈现响应阶段,因此它表明任何“重置”类型的方法都发生在任何“默认”值之后