前一个实验使用的是Form,实际情况中,还可能会使用Table。
考虑以下场景:用户修改一行记录时,修改其中某个字段后,希望能够带出其它字段值,即自动填充。
1. 为了不影响其它VO,新建一个VO:EmployeesDetailsView。
注意,为了演示自动填充的功能,这里手工添加了一个Transient Attribute:JobTitle。
也就是说,这个JobTitle并不是从Jobs EO中关联过来的。
我是为了演示输入JobId,自动把JobTitle带出来。
2. 修改JobsView,增加一个View Criteria:GetJobTitleByJobIdViewCriteria,用于根据JobId获取JobTitle。
3. 修改JobsViewImpl.java,增加一个方法:,用于根据JobId获取JobTitle,并将其暴露到Client。
public void getJobTitleByJobId(String jobId) {
this.setApplyViewCriteriaNames(null);
ViewCriteria criteria = this.getViewCriteria("GetJobTitleByJobIdViewCriteria");
this.setRangeSize(10);
this.applyViewCriteria(criteria);
this.setbv_job_id(jobId);
this.executeQuery();
}
4. 修改页面,在JobId上增加ValueChangeListener
完成后的页面代码如下:
<af:inputText value="#{row.bindings.JobId.inputValue}"
label="#{bindings.EmployeesDetailsView1.hints.JobId.label}"
required="#{bindings.EmployeesDetailsView1.hints.JobId.mandatory}"
columns="#{bindings.EmployeesDetailsView1.hints.JobId.displayWidth}"
maximumLength="#{bindings.EmployeesDetailsView1.hints.JobId.precision}"
shortDesc="#{bindings.EmployeesDetailsView1.hints.JobId.tooltip}"
autoSubmit="true" id="it6"
valueChangeListener="#{viewScope.myBackingBean.onJobIdValueChange}">
<af:autoSuggestBehavior maxSuggestedItems="10"
suggestItems="#{viewScope.myBackingBean.onJobIdSuggest}"/>
<f:validator binding="#{row.bindings.JobId.validator}"/>
</af:inputText>
对应的Managed Bean中的方法代码如下:
public void onJobIdValueChange(ValueChangeEvent valueChangeEvent) {
String newValue = (String)valueChangeEvent.getNewValue();
System.out.println("################################# 1 " + newValue);
OperationBinding binding = ADFUtils.findOperation("getJobTitleByJobId");
binding.getParamsMap().put("jobId", newValue);
binding.execute();
DCIteratorBinding it = ADFUtils.findIterator("JobsView1Iterator");
Row[] allRowsInRange = it.getAllRowsInRange();
if (allRowsInRange.length > 0) {
Row row = allRowsInRange[0];
String jobTitle = (String)row.getAttribute("JobTitle");
System.out.println("################################# 2 " + jobTitle);
ADFUtils.setBoundAttributeValue("JobTitle", jobTitle);
}
}
这里有一个问题要注意:就是何时会触发InputText上的ValueChange事件。
答案是:当输入内容和以前的内容不一样时,并且焦点离开当前InputText时。
所以,自动提示功能发生在前,用户选择和以前不同的某个选项后,才会发生ValueChange事件。
因此,不要担心ValueChange事件会调用多次,其实只有一次。
5. 修改页面的Bindings,这一点和前一个实验一样。
不同的地方是,还要多增加一个Attribute Binding:JobTitle和一个methodAction Binding:getJobTitleByJobId。
6. 运行
修改某行记录,选择某个JobId:
选定后,JobTitle会自动带出来:
Project 下载:ADF_AutoComplete(2).7z