我有一个表单,其中包含从数据库填充的值。该表单由一些ice:inputText组件和partialSubmit =“true”组成,因此当这些字段失去焦点时将对其进行验证。表单有一个保存和重置按钮。重置按钮有immediate =“true”并且只是常规的ice:commandButton,即不是type =“reset”。
典型的inputText字段:
<ice:inputText id="input1" maxlength="6" size="6" value="#{client.inboxThreshold}" partialSubmit="true">
<f:convertNumber integerOnly="true" />
<f:validateLongRange minimum="0" />
</ice:inputText>
“重置”按钮:
<ice:commandButton value="Reset" style="margin-left:5px;" actionListener="#{client.reset}" immediate="true"/>
问题是这样的:当用户更改值并单击重置按钮时,将触发actionListener以更新支持bean值。删除了验证错误,但在呈现页面时,模型值不会更新。
阶段监听器指示它从Apply_Request_Values到Render_Response。所以,我认为我需要手动触发Update_model_values阶段。
想法?
答案 0 :(得分:1)
我没试过,但听起来像是一个典型的阶段问题。简而言之,这意味着在actionListener中将bean值设置为过早的阶段。它们将被jsf组件的submitedValue覆盖。有两种可能的解决方案。
首先是绑定组件并通过setSubmittedValue直接在组件中设置所需的值。
更好的解决方案是第二个。您使用标记ice:setEventPhase
(请参阅taglib)。使用它可以强制在稍后阶段调用actionListener,因此bean上的值不会被jsf组件上提交的值覆盖。
所以尝试用ice:commandButton
围绕<ice:setEventPhase phase="INVOKE_APPLICATION">
。
PS:
阶段监听器指示它 从Apply_Request_Values到 Render_Response。所以,我认为我需要 手动触发 Update_model_values阶段。
这来自immediate="true"
。有了它,ICEfaces在第二阶段(Apply_Request_Values)完成组件的所有阶段(在您的情况下为commandButton
),然后将其他组件直接转到最后阶段(Render_Response)。因此,不调用其他组件的验证器。
我建议阅读有关阶段的内容(例如here,您也可以在“立即事件处理”部分找到有关紧急情况的详细信息)
答案 1 :(得分:0)
这是因为组件会显示提交的值,而不是您提供的数据,请参阅http://wiki.apache.org/myfaces/ClearInputComponents了解解决方案。