grails - 填充Grails g:从函数中选择

标签 grails groovy gorm

尝试从 Controller 中的函数填充g:select,这可能吗?

目前,我们有:

def run(Long id) {

    def reportInstance = Report.get(id)

    def listPromptValues = populatePrompts(reportInstance)*.values()

    if (!reportInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'report.label', default: 'Report'), id])            
        return
    }
    [reportInstance: reportInstance, listPromptValues: listPromptValues]
}

def populatePrompts(Report rp){
    //for each prompt in the report, go out and get it's values
    rp.prompts.collectMany {
        reportService.listDatatypeValues(it.datatype)
    }

}

然后g:select就是
<li class="fieldcontain">
                <g:each var="prompt" in="${reportInstance.prompts}">
                    <span id="prompts-label" class="property-label">
                        <g:message code="report.prompts.label" default="${prompt.name}:" />
                    </span>
                    <g:if test="${prompt.datatype.type == 'DropDown'}">                         
                        <g:select id="prompt.name" from="${listPromptValues}" name="prompt.name" value="" noSelection="['':'']"/>
                        <br>                            
                    </g:if>
                </g:each>
            </li>

如果只有一个提示,则效果很好,但是,如果循环中有多个提示,我们需要能够直接从gsp View 中调用populatePrompt函数,可能会发送reportId,然后取回listPromptValues。我似乎无法正常工作onChange(remoteFunction ...),并且空手而归搜索大量Google网站。

诸如createLink的工作原理
${createLink(controller:'report', action:'runReport', id:"${reportInstance.id}")}

但是,它不是selectLink,而是select标记的from属性,例如:
<g:select id="prompt.name" from="{(controller:'report',action:'populatePrompt', id:"${reportInstance.id}")}" name="prompt.name" value="" noSelection="['':'']"/>

有什么想法或方向吗?

最佳答案

我认为@JamesKleeh在他的最后评论中提出了一个可行的解决方案。

鉴于您的gsp结构是完全静态的,因此获取要动态加载的提示选择选项没有任何意义。只需从 Controller 的listPromptValues中的List包中返回这些选项,然后将其直接放入gsp中即可。

关于像[prompt1: ['a','b','c'], prompt2: ['d','e','f']]这样的参数,您可以在populatePrompts方法中获取此映射,并将每个键值对放入gsp select标记中。像这样:

Controller

{    ....
    def listPromptValues = populatePrompts(reportInstance)
    ....
}

def populatePrompts(Report rp){
    //for each prompt in the report, go out and get it's values
    def promptMap = [:]            //map to be returned
    rp.prompts.each {
        promptMap.put(it.name, reportService.listDatatypeValues(it.datatype))
    }
    return promptMap
}

gsp
                <g:each var="prompt" in="${reportInstance.prompts}">
                    <span id="prompts-label" class="property-label">
                        <g:message code="report.prompts.label" default="${prompt.name}:" />
                    </span>
                    <g:if test="${prompt.datatype.type == 'DropDown'}">                         
                        <g:select id="prompt.name" from="${listPromptValues[prompt.name]}" name="prompt.name" value="" noSelection="['':'']"/>
                        <br>                            
                    </g:if>
                </g:each>

关于grails - 填充Grails g:从函数中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14075511/

相关文章:

hibernate - Grails-使用列表时,关系的拥有方未保留

unit-testing - Grails使用Spring Security Core插件测试用户角色自定义验证约束

groovy - 如何消除编译任务期间的随机常规错误

java - 在 Java 中嵌入 Groovy(绑定(bind))

hibernate - 将日志存储在mongo中而不是mysql( hibernate )

grails - 页面上的域类属性表示

angularjs - 如何在Grails 2.5.3中使用ng-file-upload

grails - Grails-将链接作为参数传递

java - 使用正则表达式排除/删除两个特殊字符之间的字符串

grails - 集成测试中不存在findAll(String,Map,Map)方法