0

试图从我的控制器中的一个函数中填充 ag: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 视图调用 populatePrompt 函数,可能发送reportId然后取回listPromptValues。我似乎无法让 onChange(remoteFunction...) 正常工作,并且在搜索庞大的 Google 网络时空手而归。

类似于 createLink 的工作原理

${createLink(controller:'report', action:'runReport', id:"${reportInstance.id}")}

但不是 createLink,而是 select 标签的 from 属性,例如:

<g:select id="prompt.name" from="{(controller:'report',action:'populatePrompt', id:"${reportInstance.id}")}" name="prompt.name" value="" noSelection="['':'']"/>

有什么想法或方向吗?

4

1 回答 1

1

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

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

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

控制器

{    ....
    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
}

普惠制

                <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>
于 2012-12-29T03:08:09.987 回答