在动态工作流案例里,实现了表单和流程的分开设计、动态关联。在案例讲解的最后,我们提到多个表单共用多个工作流,必须解决动作引用的问题。即每个工作流都需要包含所有表单的动作,否则表单运行在工作流环境中时,会出现当前activity没有表单需要的动作的错误。

但是对于M个表单、N个工作流,这里的引用关系是很复杂的(M * N),我们在视频里给出了一个解决方案:

1、所有表单用到的动作都设置为全局动作

2、用一个公共的模块,包含所有表单的动作模块

3、每个工作流模块引用上面的公共模块,完成对所有表单动作的引用

上面的这个方案确实解决了动作引用的问题,但是这个方案在实施中还是有一定的复杂度。而且,所有的动作都是全局动作,每个工作流包含表单的所有动作,从模型设计的角度也有不合理性。

下面我们换用另一种解决方案(在原案例基础上):

1、动作不设置为全局动作,表单的process要包含自身的动作

/BIZ/demo/process/process/dynamicFlow_LeaveApply/dynamicFlow_LeaveApplyProcess.process.m
在动作设置中引用表单自身需要的三个标准动作

2、从两个工作流模块的配置文件中去除对action模块的引用

/BIZ/demo/process/process/dynamicFlow1/model.config.xml
/BIZ/demo/process/process/dynamicFlow2/model.config.xml
去掉引用/demo/process/logic/action

3、上面两步已经去掉了工作流,这时如果运行案例,在第二个环节会出现动作不存在的错误,现在我们修改.w,来解决这个问题:

var mainActivity = {};
// 设置bizData的动作上下文
mainActivity.setDataContext = function(data) {
data.process = “/demo/process/process/dynamicFlow_LeaveApply/dynamicFlow_LeaveApplyProcess”;
data.activity = “mainActivity”;
};

mainActivity.model1ModelConstructDone = function(event){
var dLeaveApply = justep.xbl(“dLeaveApply”);
var dFlows = justep.xbl(“dFlows”);

// 设置本页面的数据上下文
mainActivity.setDataContext(dLeaveApply);
mainActivity.setDataContext(dFlows);

// 数据初始化后,判断是否有任务环境
if (justep.Context.getTask()) {
// 有任务则刷新
dLeaveApply.refreshData();
} else {
// 无任务则新建
dLeaveApply.newData();
}
dLeaveApply.setState(dLeaveApply.getID(), justep.XData.STATE.EDIT);
};

红色是新增的代码,用来设置当前页面数据集的动作上下文。这样,页面运行时,数据保存用的上下文是表单自身的process和activity,而流程用的是工作流的process和activity。这种解决方案,表单和工作流的各自独立性更强,开发和实施都简化了。