Grails/GSP:突破<;g:每个>;

Grails/GSP:突破<;g:每个>;,grails,each,gsp,break,Grails,Each,Gsp,Break,有没有办法摆脱困境?我有一个页面,在这个页面中,我正在遍历一个列表,我必须确保选中一个复选框,如果它是存储在DB中的值 为了更清楚一些,请考虑一下: <g:each in=${list1}> <g:each in=${list2}> <g:if test="${list1.id == list2.id}"> <input type="checkbox" ... checked="checked" />

有没有办法摆脱困境?我有一个页面,在这个页面中,我正在遍历一个列表,我必须确保选中一个复选框,如果它是存储在DB中的值

为了更清楚一些,请考虑一下:

<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(…)(即所选值)

在g:each中,我需要用一个复选框显示所有列表1(因此,内部列表后面的“…”),但我需要确保相应地选中列表2中的列表(保存到DB的用户选择项)(if语句)

现在,如果检查状态在第一次迭代中被更改,我需要从内部每个。。。有办法吗


谢谢

不,不是每个子句

我只需要编写我自己的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
    }

}
def eachCheckedItem={attrs,body->
def list1=attrs.list1
def list2=attrs.list2
list1.findAll{list2.contains(it)}.each{

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

<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:any test="${it.id==elem1.id}" in="${list2}">...</g:any>

...
没有g:any标记,但正如Ted指出的,编写一个标记很容易(留给读者作为练习)。然后,您可以将内部标记简化为如下内容:

<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:any test="${it.id==elem1.id}" in="${list2}">...</g:any>
。。。

您应该在模型中执行此操作,这样在视图中就只有一个简单的循环。然后,只需让控制器调用Domain.findMyList()即可或者随便什么。

对于搜索原始海报问题答案的谷歌人来说,gsp中没有中断命令。这里有一些更好的回答,在我看来,最好的一个是尝试使用.findAll{..},在“中断”之前只查找您希望处理的设置


啊,好吧……我会进一步调查的。谢谢!!