填充Grails g:select from函数

填充Grails g:select from函数,grails,groovy,gorm,Grails,Groovy,Gorm,尝试从控制器中的函数填充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.mes

尝试从控制器中的函数填充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>
但不是createLink,而是select标记的from属性,类似于:

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


有什么想法或方向吗?

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

鉴于gsp结构是静态的,获取要动态加载的提示select选项是没有意义的。只需从控制器返回
listPromptValues
中的列表包中的这些选项,并直接在gsp中获取

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

控制器

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



我听不懂你的问题,可能是因为你的数据对我来说毫无意义。Ok@JamesKleeh。我们有一个报表对象,它又有提示。提示是存储在数据库中的值,我需要通过控制器在UI上填充它们。提示可以有不同的值,比如一个是一年,另一个是一个月。如何使用该数据填充g:select?listPromptValues已经发送到视图中。当前g:select工作正常吗?还有什么其他数据需要在那里?假设这个报告有两个提示,当在控制器中调用run时,它将返回listPromptValues,其中两个提示的值都在一个大列表中。我需要返回2个列表,或者根据提示的数量返回n个列表。每个提示都应该从控制器返回自己的值列表。您可以发送一个包含所有这些数据的映射,而不需要使用ajax。我同意这个页面是非常静态的。理想情况下,当最终用户选择报告时,应该只对控制器进行一次调用,该调用将返回所有列表值。我该怎么办?我找不到任何关于如何从控制器构建列表包,然后从gsp页面中解析数据的参考。Thanks@Idonaldson这是Grails的基本功能。您可以在Grails文档中找到大量示例。本质上,它是关于从控制器发送嵌入式列表并在gsp视图中呈现它们。在这个场景中是有用的。我得到了,而嵌入列表的工作方式正是我所缺乏的。感谢@Jinzhao重申我不知道Grails。更具体地说,我如何构建映射[prompt1:['a','b','c',prompt2:['d','e','f']]@idonaldson我更新了代码。我不确定你的域定义,所以这只是一个例子。如果你不能得到它的权利,让我看看你的域类。谢谢!这无疑让我离我需要的地方更近了。现在我只需要弄清楚如何将这些值从映射中剥离出来。我将其命名为def listPromptValues=populatePrompts(reportInstance)*.values(),但现在会抛出一个错误。因此,我将*.values()移到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>