如何呈现除一个inputText之外的所有网格字段?

如何呈现除一个inputText之外的所有网格字段?

问题描述:

我有一个使用ajax的搜索表单。在搜索字段searchKeyFieldIdkeyup事件期间,我需要更新同一面板网格中的所有其他字段。如何呈现除一个inputText之外的所有网格字段?

<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组件树的字符串,但是写的代码,将需要更多的字符超过必要硬编码在视图中已经definied的客户端ID。

标准JSF和RichFaces中没有其他方法。然而,PrimeFaces提供了PrimeFaces Selectors(PFS)的替代品。另请参阅此相关问题:How to exclude child component in ajax update of a parent component?

完全不同的替代方法是将面板网格分为两个面板网格,一个面板网格包含搜索输入,另一个网格包含要更新的字段。如有必要,您可以将它们与CSS的良好镜头对齐。

+0

谢谢。你非常有帮助@BalusC – 2013-04-18 08:30:05