【问题标题】:How to pass a List of Maps to a GSP page view and iterate over it如何将地图列表传递给 GSP 页面视图并对其进行迭代
【发布时间】:2013-09-03 17:49:50
【问题描述】:

假设我们要显示有关文件夹文件的信息。我们必须将每个文件的信息保存在 Map 中。然后,将这些地图添加到列表中。

控制器动作:

def show() {

    List results = new ArrayList();

    File dir = getDir(params.id);

    if (dir.exists()) {
        dir.eachFile { 

        Map fileInformation= new java.util.LinkedHashMap()

        fileInformation.put("name", it.getName());
        fileInformation.put("size", it.length());
        fileInformation.put("path", it.getAbsolutePath() );

        results.add(fileInformation);

        }
    }

    [filesOfFolderData: result]
}

也许,这是我在视图中获取数据的最佳尝试(我遵循here 的方法,但没有运气):

<g:each in="${filesOfFolderData}">

    <p> it: ${it}</p>
    <p> it.properties: ${it.properties} </p>

    <g:each var="propertyEntry" in="${it.properties}">

        <p> propertyEntry.key: ${propertyEntry.key} </p>
        <p> propertyEntry.value: ${propertyEntry.value} </p>
        <p> propertyEntry.value.name: ${propertyEntry.value} </p>           

    </g:each>

</g:each>

这是互联网浏览器显示的内容(注意:结果的第一行可能会有点不同,因为我简化了代码,所以我将结果作为我案例实际结果的基础):

it: [{name=wololo1, size=35, path=c:\}, {name=wololo2, size=35, path=c:\}]

it.properties: {class=class java.util.ArrayList, empty=false}

propertyEntry.key: class

propertyEntry.value: class java.util.ArrayList

propertyEntry.value.name: class java.util.ArrayList

propertyEntry.key: empty

propertyEntry.value: false

propertyEntry.value.name: false 

我们如何迭代列表?

【问题讨论】:

    标签: loops grails groovy gsp


    【解决方案1】:

    使用地图中的each,您可以访问keyvalue,因此只需遍历该值即可。

    <g:each in="${filesOfFolderData}" var="files">
      <g:each in="${files.value}" var="file">
        ...
      </g:each>
    </g:each>
    

    【讨论】:

    • 它只有在我们构建地图地图(而不是地图列表)时才有效。我会按照meta.stackoverflow 的建议回答我自己的问题。再次感谢您的帮助! :)
    【解决方案2】:

    好吧,您可以使用下面给出的代码: 示例:

    filesOfFolderData= [{name=wololo1, size=35, path=c:\}, {name=wololo2, size=35, path=c:\}]
    
    <g:each in="${filesOfFolderData}" var="fileMap">
      <g:each in="${fileMap}" var="file">
        ${file.key}: ${file.value}
      </g:each>
    </g:each>
    

    输出:

    name: wololo1
    size: 35
    path: c:\
    name: wololo2
    size:35
    path: c:\
    

    希望对你有帮助!!!

    谢谢

    【讨论】:

    • 这是您在上面给出的示例中看到的地图列表......这就是您所需要的。
    • 谢谢,但是如果我写了,我得到了编译器错误:Groovy:unexpected char: '\' @ line 95, column 66. 我把它改成了:def filesOfFolderData= [{url="wololo1", thumbnail_url="35", name="c:\\"} {url="wololo2", thumbnail_url="35", name="c:\\"}]。但它在第一个逗号处给出了编译器错误:Groovy:expecting '}', found ',' @ line 94, column 41. 我尝试不使用逗号和另一个编译器错误...
    • 啊!在控制器中使用您在问题中提到的相同代码,并使用 gsp 中给出的以下代码: ${file.key}: ${file.value}
    • 这行不通。我们必须使用 Map of Maps 而不是 Maps List。看我的回答;)
    【解决方案3】:

    我们必须创建地图地图,而不是地图列表

    def show() {
    
        def results = []
        File dir = getDir(params.id);
    
        if (dir.exists()) {
            dir.eachFile {  
    
                results <<  [
                                name: it.getName(),
                                size: it.length(),
                                it.getAbsolutePath()
                            ]                   
            }
        }
    
        [filesOfFolderData: result]
    }
    

    然后,@SergioMichels 的解决方案将完美运行(我复制并粘贴他的解决方案):

    <g:each in="${filesOfFolderData}" var="files">
      <g:each in="${files.value}" var="file">
        ...
      </g:each>
    </g:each>
    

    【讨论】:

    • 但是,如果您访问 fileOfFolderData 是地图列表,则 [fileOfFolderData:results] 作为模型传递给视图等视图。在这里,您发送的是 [{name=wololo1, size=35, path=c:\}, {name=wololo2, size=35, path=c:\}] 这不是 fileOfFolderData 的值吗?
    • [name: it.getName(),size: it.length(),path: it.getAbsolutePath()] 应该使用正确的地图。
    • 我知道这很奇怪,但 Grails 就是这样工作的。 Grails 希望您将 Map 传递给视图,而不是 List,因此我们必须伪造它。在本例中,“父 Map”只有一个键(filesOfFolderData)和一个值(results,包含所有 Map)。
    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2021-11-23
    • 2011-01-05
    相关资源
    最近更新 更多