1

我有一个使用 ajax 的搜索表单。在keyup搜索字段事件期间searchKeyFieldId,我需要更新同一面板网格中的所有其他字段。

<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 个,这种解决方案不是一个好习惯。

4

1 回答 1

3

这个解决方案不是一个好习惯

对不起,但这很荒谬。它完全可以完成您想要的工作,因此是正确的方法。克服它并把它们都写下来。如有必要,您可以将样板文件隐藏在 bean 属性后面。

render="#{MyController.clientIdsToRender}"

如有必要,您可以根据 JSF 组件树自动填充字符串,但为此编写代码将需要比硬编码视图中已定义的客户端 ID 所需的更多字符。

在标准 JSF 和 RichFaces 中没有其他方法。然而,PrimeFaces 提供了PrimeFaces 选择器(PFS) 的替代方案。另请参阅此相关问题:如何在父组件的 ajax 更新中排除子组件?

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

于 2013-04-17T14:42:09.143 回答