0

我在同一个视图页面(overview.xhtml)中有 3 个openFaces 。 <o:datatable />

  • 第一个显示所有音乐乐队的列表
  • 2d 显示由乐队编写的所有歌曲的列表
  • 3d 显示乐队提供的所有节目的列表

我正在使用<o:inputTextFilter />行 ID 过滤第一个数据表(

<h:form>
        <o:datatable value="#{bandBean.items}" var="band" ........<o:inputTextFilter 
        expression="#{band.id}" .../> 
</h:form>

<h:form>    
    <o:datatable value="#{showBean.items}" var="show" ........<o:inputTextFilter 
        expression="#{band.id}" .../> 
</h:form>
    <h:form>
    <o:datatable value="#{songBean.items}" var="song" ........<o:inputTextFilter 
        expression="#{band.id}" .../> 
</h:form>

歌曲和节目是乐队的子对象。我真正需要的是能够使用相同的 inputTextFilter 或类似的东西过滤 3 个数据表,因为这 3 个数据表每个都有一个带有波段 ID 的列。

用户将永远不会接受三次键入乐队 ID,第一次是 BAND 表,第二次是节目表,第三次是歌曲表,使用 3 个过滤器。相反,他想输入一次 band ID ,然后立即过滤 3 个表。

一种解决方法是使用三个<o:inputTextFilter />并使用 javascript 或 ajax 设置它们的值:当用户在过滤器中输入内容时,输入的值会立即附加到其他过滤器。我想不出那个解决方法。然而,显示 3 个过滤器似乎很奇怪,而用户应该只使用一个。任何想法和帮助都是宝贵的!

4

1 回答 1

2

不直接支持将过滤器附加到多个表,但是您可以模拟此行为。为此,您可以使用“for”属性将隐藏(“display:none”)附加到每个表,并以编程方式为所有表指定过滤值。

这是一个简单的代码片段,演示了这个想法:

<o:inputText value="#{MyBean.filterText}"/> 
<o:commandButton value="Submit" action="#{MyBean.filterAllTables}"/> 
<o:inputTextFilter for="table1" expression="#{book.bookTitle}" 
                   value="#{MyBean.filterCriterion}" style="display: none"/> 
<o:inputTextFilter for="table2" expression="#{book.bookTitle}" 
                   value="#{MyBean.filterCriterion}" style="display: none"/> 
<o:dataTable id="table1" ...> 
<o:dataTable id="table2" ...> 

MyBean.java:

private String filterText; // a property w/ getter/setter 
private ExpressionFilterCriterion filterCriterion; // a property w/ getter/setter 

public void filterTables() { 
    String filterText = getFilterText(); 
    SimplePropertyLocatorFactory.SimplePropertyLocator propertyLocator =
                new SimplePropertyLocatorFactory.SimplePropertyLocator("id"); // "id" is a property name by which you'd like to filter
    ExpressionFilterCriterion filterCriterion = new ExpressionFilterCriterion(
                propertyLocator, FilterCondition.CONTAINS, filterText); 
    setFiterCriterion(filterCriterion); 
} 
于 2011-06-24T19:39:34.550 回答