2014-04-28 15 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