2014-04-28 17 views
0

想象一下,您有一個顯示書籍列表(如索引)的表格,並且您想在名爲「Sold」的列中進行更改(複選框例如)。所以一旦你完成了「檢查」你已售出的書籍,你點擊一個按鈕來保存!如何將該列表發送回控制器並進行更新?Grails在GSP中更新列表(視圖),然後用按鈕提交

所以,代碼是這樣的,在所述控制器:

DEF amethod方法(){... [bookInstanceList:myBookList] }

在GSP:

<g:each in="${bookInstanceList}" status="i" var="bookInstance"> 
     <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> 

      <td><g:link action="show" id="${bookInstance.id}">${fieldValue(bean: bookInstance, field: "author")}</g:link></td> 
      <td><g:checkBox name="sold" value="${bookInstance?.sold}" /></td> 
      <td> 
     </tr> 
    </g:each> 

這個想法是通過複選框讓用戶更改該書中的「已售出」值,然後使用按鈕進行提交。我怎樣才能保存我的新bookInstanceList?

非常感謝您

+1

這不能用純粹的grails完成。在我看來,最好的方法是引入Javascript來確定哪些書籍已經被「出售」,並將該列表提交給控制者。 – rmlan

+1

在OP中沒有任何內容不能用純Grails完成或者需要使用Javascript。可能有沒有在帖子中指定他可能想使用Javascript的原因,但作爲書面,他可以做到這一點沒有Javascript。 –

+0

你說得對,我說得太快了。您的示例應用程序是完成此操作的好方法。 – rmlan

回答

2

有一個在https://github.com/jeffbrown/books一個簡單的示例應用程序,它顯示了你可以做到這一點的方法之一。運行應用程序,打開默認的索引頁面,點擊鏈接,然後會進入一個頁面,您可以點擊複選框並更新圖書館。

感興趣的文件是https://github.com/jeffbrown/books/blob/master/grails-app/controllers/com/demo/BookController.groovyhttps://github.com/jeffbrown/books/blob/master/grails-app/views/book/index.gsp

我希望有幫助。

+0

哇,非常感謝你!你做了一個示範小項目謝謝! – Alberici

1

我已經刪除了一些標記爲簡潔,並把焦點的重要位。這是一種不依賴Javascript的方法,你知道什麼是純粹的Grails。永遠不要說永遠,@ rmlan。

<g:form action="updateSold" controller="book"> 
    <table> 
     <tbody> 
     <g:each in="${bookInstanceList}" status="i" var="bookInstance"> 
      <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> 
       <td><g:link action="show" id="${bookInstance.id}">${fieldValue(bean: bookInstance, field: "title")}</g:link></td> 
       <td> 
        <g:checkBox name="sold" value="${bookInstance.sold}" /> 
        <g:hiddenField name="id" value="${bookInstance.id}" /> 
       </td> 
      </tr> 
     </g:each> 
    </tbody> 
    </table> 
    <g:submitButton name="updateSold" value="Update" /> 
</g:form> 

這是控制器的動作:

def updateSold() { 
    def solds = params.list('sold') 
    def ids = params.list('id') 

    ids.eachWithIndex { id, idx -> 
     if (solds[idx]) { 
      // the book's sold has been checked, so update it to TRUE   
     } else { 
     // the books sold has not been checked, so update it to FALSE 
     } 
    } 
} 
+0

你會發現這個解決方案適用於99.9%的瀏覽器。但是,我將要成爲那個人*並指出W3的形式規範實際上並不能保證形式參數的順序。因此,相信這兩個數組索引相同並不是萬無一失的。只是說... – rmlan

+0

這裏的問題不僅僅是W3規範的細節,而且params.list(...)方法也沒有聲明返回列表中元素的順序。你可能真的不應該依賴這個順序。我在不同的答案中鏈接的示例通過使用索引參數名稱(如[index goes here])來處理訂購問題。 –

+0

非常感謝格雷格,這個答案也工作 – Alberici