Grails / GSP:突破<g:each> </g:each>

时间:2010-07-13 03:22:36

标签: grails each gsp break

有没有办法打破&lt; g:each&gt;?我有一个页面,其中我正在遍历列表,我必须确保选中一个复选框,如果这是存储在数据库中的值。

为了使它更清晰,请考虑以下内容:

<g:each in=${list1}>
    <g:each in=${list2}>
        <g:if test="${list1.id == list2.id}">
            <input type="checkbox" ... checked="checked" />
        </if>
    </g:each>
    ...
</g:each>

其中list1是,例如Domain1.list()(即所有可能的值),list2是Domain2.find(...)(即SELECTED值)

在g:each中,我需要显示所有list1(因此,内部各个之后的“......”)带有一个复选框但是我需要确保list2中的那些(用户选择的项目是应该相应地检查保存到DB)(如果声明)。

现在,如果在第一次迭代时更改了检查状态,我需要离开每个内部......任何方法都可以这样做吗?

谢谢!

4 个答案:

答案 0 :(得分:5)

不,不是每个条款。

我只是编写自己的taglib,它接受list1和list2并为你做迭代,然后回到

<g:eachCheckedItem list1="${list1}" list2="${list2}">
    <input type="checkbox" ... checked="checked"/>
</g:eachCheckedItem>

在你的taglib类中:

def eachCheckedItem = { attrs, body ->
    def list1 = attrs.list1
    def list2 = attrs.list2

    list1.findAll { list2.contains(it) }.each {
        out << body(listItem: it)  // access to listItem variable inside gsp
    }

}

类似的东西(根据您的具体问题调整)很容易编写,并且还可以清理您的gsp文件。我一直在我的taglibs中使用这些自定义迭代器。

答案 1 :(得分:1)

如果我理解正确,你需要这样的东西:

<g:each var="elem1" in="${list1}">
   <g:if test="${list2.any{it.id==elem1.id}}">
     <input type="checkbox" checked="checked" />
   </g:if>
   ...
</g:each>

没有g:任何标签,但正如Ted所指出的那样,写一个(作为练习留给读者)会很容易。然后你可以将内部标签简化为:

<g:any test="${it.id==elem1.id}" in="${list2}">...</g:any>

答案 2 :(得分:1)

您应该在模型中执行此操作,因此您只能在视图中使用一个简单的循环。然后,只需要让控制器调用Domain.findMyList()或其他任何东西。

答案 3 :(得分:0)

对于寻找原始海报问题答案的googlers,gsp中没有break命令。这里有一些更好的回答,我认为其中最好的一个是尝试并使用.findAll {..}来找到你期望在'休息'之前工作的集合。

http://markmail.org/message/tt2einl3ntwgzdep#query:grails%20gsp%20break%20out%20of%20loop+page:1+mid:nzhgwdsgkrwkurt4+state:results