在《使用ADF-BC 实现查询功能之一:All Queriable Attributes》中,全字段查询界面和结果是在同一个页面。
实际使用中,有些客户希望把查询界面放到popup组件中,查询完毕后,页面刷新显示查询结果。
这里我们可以使用一些小技巧,不需要很大的改动就可以实现该功能。
重要步骤说明:
1. 创建页面,添加查询按钮,点击后弹出popup组件
2. 创建popup组件
(1)在其中添加dialog组件,其中Type=none,表明不需要任何OK或Cancel按钮。
(2)在dialog组件中,拖放All Queriable Attributes生成全字段查询Panel,其内容如下:
<af:query id="qryId1" headerText="Search" disclosed="true" value="#{bindings.ImplicitViewCriteriaQuery.queryDescriptor}" model="#{bindings.ImplicitViewCriteriaQuery.queryModel}" queryListener="#{bindings.ImplicitViewCriteriaQuery.processQuery}" queryOperationListener="#{bindings.ImplicitViewCriteriaQuery.processQueryOperation}" resultComponentId="::resId1"/>
稍后我们会做些改动。
3. 创建一个Managed Bean
(1)把table组件绑定到Managed Bean中的一个属性,这样可以在代码中操作table组件。
(2)把popup组件绑定到Managed Bean中的一个属性,这样可以在代码中操作table组件。
(3)修改queryListener,将其指向Managed Bean中的一个方法: queryListener="#{myBackingBean.queryListener}"。
queryListener方法内容如下:
public void queryListener(QueryEvent queryEvent) { // 首先通过程序调用原有的queryListener JSFUtils.invokeMethodExpression("#{bindings.ImplicitViewCriteriaQuery.processQuery}", Object.class, QueryEvent.class, queryEvent); // 隐藏popup组件 searchPopup.hide(); // 刷新table组件 AdfFacesContext.getCurrentInstance().addPartialTarget(resultTable); }
4. 运行页面
点击Search按钮,弹出popup窗口,输入条件,回车确定。
Table将显示符合查询条件的记录。
5. 小结
使用JSFUtils.invokeMethodExpression可以在代码中调用原来绑定在组件上的Listener事件。
这是一种定制组件Listener事件的方式:在调用原有Listener方法的前后加入自己的逻辑。
Project 下载:ADF_QueryInPopup.7z
没有评论:
发表评论