# 动态DataSource
# 概念
当表单中某个控件需要在用户操作表单其他控件或表单变量变化时,展示出不同范围的可选值,可以结合onFieldChange事件,对Code类型控件的DataSource进行动态赋值。
情况1:当控件影响值为唯一,例如 控件X 的可选数据只受 控件A 的数值变化,通常可以做code代码表parent级联实现。
情况2:当控件影响值不唯一,例如 控件A 、 控件B 、表单变量 均有机会影响到 控件X 的可选项数据, 则需要通过onFieldChange事件进行动态查询和筛选将结果集赋值给 控件X 的DataSource。
# 需求场景
- 表单控件B根据用户对控件A操作的选项,动态筛选出与A控件选择项有关的
# 开发要点
表单中 "参与方式" 根据 "申报方向" 选项值,进行动态赋值下拉选项
“申报方向” 需要设置onFieldChange事件
“参与方式” 代码类型忽略“内部代码表”或“外部代码表”
本案例为简要说明,未使用多个控件值作为查询条件
messenger onFiledChange 事件
public InfoPlusResponse onFieldChanging(InfoPlusEvent e){
MajorProjectPlanApply app=e.toBean(MajorProjectPlanApply.class);
switch(e.getChangingField()){
//申报方向事件
case"fieldProjectDirection":
if(app.getProjectDirection()!=null && StringUtils.isNotEmpty(app.getProjectDirection().getCodeId())){
//根据申报方向id查询筛选过滤值
CodeItem p=majorProjectPlanManager.getParticipation(app.getProjectDirection().getCodeId());
app.setParticipation(p);
}
break;
}
InfoPlusResponse response=new InfoPlusResponse(e,app);
return response;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- “参与方式”控件 取值及赋值实现
public CodeItem getParticipation(String sourceCode) {
//查询条件
Map<MajorProjectParticipationQueryCondition, Object> conditions = new HashMap();
conditions.put(MajorProjectParticipationQueryCondition.DIRECTION_CODE_EQ, sourceCode);
//查询结果
List<MajorProjectParticipation> list = majorProjectParticipationDAO.getList(conditions, 0, -1, null, true);
//结果转换
Map<String, String> participationMap = new HashMap<String, String>();
String codes="";
String names = "";
if (!CollectionUtils.isEmpty(list)) {
codes = list.stream().map(MajorProjectParticipation::getCode).collect(Collectors.joining("\n"));
names = list.stream().map(MajorProjectParticipation::getName).collect(Collectors.joining("\n"));
}
//dataSource属性赋值
participationMap.put("datasource", codes);
participationMap.put("datasource_Names", names);
CodeItemImpl codeItem = new CodeItemImpl();
codeItem.setAttributes(participationMap);
return codeItem;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# CheckList
# 因CheckList控件绑定特殊性,动态赋值需要额外用一个隐藏控件作为数据来源
- 效果
- 增加一个隐藏控件
可在messenger Rendering 或 onFiledChange 事件中对数据赋值
样例中数据查询条件及实现此处省略
public InfoPlusResponse onStepFillRequestRendering(InfoPlusEvent e) {
InfoPlusExampleParallelAdvanced form = e.toBean(InfoPlusExampleParallelAdvanced.class);
form.setMemberFavoritesDataSource("旅行\n摄影\n电影\n游戏\n音乐\n极限运动");
InfoPlusResponse response=new InfoPlusResponse(e, form);
return response;
}
1
2
3
4
5
6
2
3
4
5
6
- 数据赋值隐藏控件,CheckList控件使用DataSource属性设置进行绑定