我在同一视图页面(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个数据表都有一个带ID的列。
用户永远不会接受先输入三次band idBAND表的波浪号,shows表和第三次用于歌曲表,使用3个过滤器。相反,他想打一次乐队ID,3个表立即被过滤。
一种解决方法是使用三个<o:inputTextFilter />
,并使用javascript或ajax设置它们的值:当用户在过滤器中键入内容时,所键入的值会立即附加到其他过滤器中。我想不出那种变通办法。然而,显示3个过滤器而用户应该只使用一个似乎很奇怪。任何想法和帮助都将是宝贵的!
没有直接支持将过滤器附加到多个表,但是您可以模拟这种行为。为此,您可以附加对每个表隐藏("display:none")使用"for"属性,并为所有它们以编程方式。
这里有一个简单的代码片段来演示这个想法:
<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);
}