我正在为我的应用程序使用ICEFaces 1.8。我在这样的网格中有一些SelectInputText:
<ice:panelGrid columns="4">
<ice:selectInputText id="txtId"
valueChangeListener="#{employeeBean.searchIdListener}" partialSubmit="true"></ice:selectInputText>
<ice:selectInputText id="txtFirstName"
valueChangeListener="#{employeeBean.searchFirstNameListener}" partialSubmit="true"></ice:selectInputText>
<ice:selectInputText id="txtLastName"
valueChangeListener="#{employeeBean.searchLastNameListener}" partialSubmit="true"></ice:selectInputText>
<ice:selectInputText id="txtPhoneNumber"
valueChangeListener="#{employeeBean.searchPhnNbrListener}" partialSubmit="true"></ice:selectInputText>
</ice:panelGrid>
当我更改上述任何一个SelectInputText的值时,我可以看到所有上述四个ValueChangeListener方法都被执行 - 为什么?
不应该只是执行其SelectInputText有一些值更改的方法吗?
请让我知道这件事。
答案 0 :(得分:2)
可能会发生这种情况,因为<ice:selectInputText>
初始值为 NULL ,首次部分或完整提交将导致从页面提交 EMPTY字符串。
使用空字符串初始化您的selectInputText以避免这种情况,或者您可以在JSF 2.x中添加以下内容,
<context-param>
<param-name>
javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
</param-name>
<param-value>true</param-value>
</context-param>
另外要添加到Icefaces,它的部分提交有点令人困惑。 它更像是使用部分Ajax / DOM呈现的完整Ajax提交。在某些情况下,icefaces 1.8将在页面上执行多个组件,但它在数据表列,panelSeries等中避免使用它。
答案 1 :(得分:1)
我认为这源于对partialSubmit
属性的意图以及对valueChangeListener
的误解的误解。
通过单击提交按钮提交表单时,可以说,表单中绑定到托管属性值或在valueChangeListener
中分配了托管bean方法的所有组件的请求值都由其提交,处理和验证。服务器。假设验证阶段成功,那些提交的值将传递到UPDATE_MODEL
阶段,其中将调用每个valueChangeListener方法。
基本上,此方法 NOT 被视为应用事件,如点击或更改事件。
使用Ajax提交但我们可以控制将提交JSF表单中的哪些组件,以及在客户端收到响应后将重新呈现哪些控件以显示其新值。但是,属性partialSubmit
只是与Ajax请求一起使用,以最小化ViewState的大小和性能请求。从功能上讲,这个partialSubmit
属性本身没有任何实际效果。