2010-07-13 52 views
2

有沒有辦法突破< g:each>?我有一個頁面,其中我遍歷一個列表,我必須確保複選框被檢查,如果這是存儲在數據庫中的值。Grails/GSP:突圍<g:each>

使其更清晰一點,請考慮這樣的:

<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:每一個,我需要顯示所有的list1(因此,「...」之後的內部每個)與複選框,但我需要確保那些在list2(應該相應地檢查用戶選擇的保存到數據庫的項目(如果聲明)。

現在,如果在第一次迭代中檢查的狀態發生了變化,我需要從每個內部跳出......任何方式來做到這一點?

謝謝!

回答

5

不,不是每個子句。

我只是寫我自己的標籤庫是需要列表1和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文件。我在taglib中始終使用這些自定義迭代器。

+0

啊,好吧...我會看看這個多。謝謝!! – callie16 2010-07-13 06:48:23

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:任何標記,但泰德指出,這將是很容易寫一個(左作爲一個練習讀者)。然後你可以簡化內部標籤到這樣的事情:

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

你應該在模型中做到這一點,所以你只在視圖中有一個簡單的循環。然後,只需要讓控制器調用Domain.findMyList()或其他任何東西。