我想调用控制器未知的子流。它在参数中传递给beginFlow,我将其保存在流量范围内。在goToForm里面我想调用使用flow.theController中保存的控制器。
def beginFlow = {
enter {
action {
if (params?.redirectTo != null) {
String flow.theController = params.redirectTo
}
if ( flow.theController() ) {
success()
}
}
on("success").to("beginPage")
}
beginPage {
on('next').to('goToForm')
}
goToForm {
// I'd like this:
// subflow(controller: flow.theController, action:'start'
// this subflow works, but won't work for all cases
subflow(controller: 'AZ_A4', action:'start')
on('done').to('showResults')
on('notDone').to('beginPage')
}
showResults {
redirect(action: 'results')
}
}
答案 0 :(得分:0)
正如用户列表中所讨论的那样,似乎无法直接进行此操作,因为在构建流结构时(在应用程序启动时)必须知道子流名称。但是由于流定义DSL是Groovy代码,你可以这样做:
beginPage {
on('next').to('selectSubflow')
}
selectSubflow {
action {
return "subflow_${flow.theController}"()
}
for(subController in listOfControllers) {
on("subflow_${subController}").to("subflow_${subController}")
}
}
for(subController in listOfControllers) {
"subflow_${subController}" {
subflow(controller:subController, action:'start')
on('done').to('showResults')
on('notDone').to('beginPage')
}
}
listOfControllers可能是某个地方的静态,或者您可以在流程定义的顶部执行类似的操作
def beginFlow = {
def listOfControllers = grailsApplication.controllerClasses.findAll {
it.flows.containsKey('start')
}.collect { it.logicalPropertyName }
enter {
// ...
枚举应用程序中定义startFlow的所有控制器。您可能需要在班级中使用def grailsApplication
,我总是忘记Grails中哪些地方默认可用,哪些不可用...