我有一个使用ajax的搜索表单。在搜索字段searchKeyFieldId
的keyup
事件期间,我需要更新同一面板网格中的所有其他字段。
<h:panelGrid id="myGrid" columns="4" >
<!-- When searchKeyFieldId change ... -->
<!-- Need to render all the myGrid EXCEPT searchKeyFieldId -->
<h:outputText value="search key"/>
<h:inputText id="searchKeyFieldId"
value="#{MyController.searchKeyField}"
valueChangeListener="#{MyController.licenseNumberChange}" >
<a4j:ajax event="keyup" render="myGrid" />
</h:inputText>
<h:outputText value=""/>
<h:outputText value=""/>
<!-- Target render fields -->
<h:outputText value="text1"/>
<h:inputText id="field1"
value="#{MyController.field1}"/>
<h:outputText value="text2"/>
<h:inputText id="field2"
value="#{MyController.field2}"/>
<h:outputText value="text3"/>
<h:inputText id="field3"
value="#{MyController.field3}"/>
.....
</h:panelGrid>
然而,当我使用render="myGrid"
时,搜索字段也被更新,因此失去了焦点。最终用户必须再次单击/聚焦输入字段才能继续输入。
所以,我只需要更新特定的字段,如下所示:
<a4j:ajax event="keyup" render="field1 field2 field3 field4 field5 ..." />
但是,我有很多字段,确切地说是40,这个解决方案不是一个好的做法。
这个解决方案不是一个好的实践
对不起,但这是荒谬的。这正是你想要的工作,因此是正确的方法。把它们都写下来。如果有必要,您可以将样板文件隐藏在bean属性后面。
render="#{MyController.clientIdsToRender}"
如果有必要的话,您可以根据JSF组件树自动填充字符串,但是为此编写代码将需要更多的字符来硬编码视图中已经定义的客户端id。
在标准JSF和RichFaces中没有其他方法。然而,PrimeFaces提供了一种替代的PrimeFaces选择器(PFS)。另请参阅相关问题:如何在父组件的ajax更新中排除子组件?
另一种完全不同的选择是将面板网格分成两个面板网格,一个包含搜索输入,另一个包含要更新的字段。如果有必要,你可以用一个好的CSS镜头来对齐它们。