【问题标题】:Populate Grails g:select from function填充 Grails g:从函数中选择
【发布时间】:2012-12-28 20:39:24
【问题描述】:

尝试从我的控制器中的函数中填充 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 视图调用 populatePrompt 函数,可能发送reportId然后取回列表提示值。我似乎无法让 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="['':'']"/>

有什么想法或方向吗?

【问题讨论】:

  • 我无法回答您的问题,可能是因为您的数据对我来说毫无意义。
  • 好的@JamesKleeh。我们有一个报表对象,它又具有提示。提示是存储在数据库中的值,我需要通过控制器在 UI 上填充它们。提示可以有不同的值,比如说一个是一年选择,另一个是一个月。我将如何使用该数据填充 g:select?
  • listPromptValues 已经被发送到视图。当前的 g:select 工作正常吗?里面还需要哪些其他数据?
  • 假设此报告有两个提示,当在控制器中调用 run 时,它将返回 listPromptValues 以及两个提示的值在一个大列表中。我需要根据提示的数量取回 2 个列表或 n 个列表。每个提示都应该从控制器返回它自己的值列表。
  • 你可以发送一张包含所有数据的地图,你不需要用ajax来做。前[prompt1: ['a','b','c'], prompt2: ['d','e','f']]

标签: grails groovy grails-orm


【解决方案1】:

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

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

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>

【讨论】:

  • 我同意该页面是非常静态的。理想情况下,当最终用户选择报告时,应该只调用一次控制器,并且该调用将返回所有列表值。我该怎么办?我找不到任何关于如何从控制器构建列表包,然后从 gsp 页面中解析数据的参考资料。谢谢
  • @Idonaldson 这是 Grails 的基本内容。您可以在 Grails Docs 中找到大量示例。本质上,它是关于从控制器发送嵌入式列表并在 gsp 视图中呈现它们。 在这种情况下很有用。
  • 我得到了 ,而嵌入列表的工作方式正是我所缺乏的。感谢@Jinzhao 重申我不了解 Grails。更具体地说,我如何构建地图 [prompt1: ['a','b','c'], prompt2: ['d','e','f']]
  • @idonaldson 我更新了我的代码。我不确定您的域定义,所以这只是一个示例。如果您不能正确使用,请向我展示您的域类。
  • 谢谢!这无疑让我离我需要去的地方更近了。现在我只需要弄清楚如何将值从地图中剥离出来。我将它作为 def listPromptValues = populatePrompts(reportInstance)*.values(),但现在会引发错误。所以我将 *.values() 移到了 gsp 中,它似乎返回了值列表。关于删除地图括号[]的任何想法?再次感谢您的所有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
相关资源
最近更新 更多