我试图使用grails 2.2.1在一个视图上显示1对多的关系。
基本上,我想使用一个视图来显示两个列表(一个父列表,一个子列表)。此外,我想创建一个对控制器的调用,以根据父列表中选择的记录在子列表中显示正确的子记录。域名看起来像这样......
class Parent{
string name
string attribute
static hasMany = [children : Child]
}
class Child{
string name
string childattribute
static belongsTo = [parent: Parent]
}
父控制器将是......
class AppstackController {
static scaffold = Appstack
def index ={
def parent = Parent.list()
def childList= parent?.child
render(view: "list", model:[parentlist: Parent.list(), childList: childList])
}
def getChildren = {
def parent= Appstack.get(params.id)
def childList= parent?.child
render (view: "list", model:[childList: childList])
}
}
我希望能够通过单击父列表中的行来调用getChildren操作并更新视图上的子列表。我假设这可以用remoteLink或remoteFunction完成。
控制器和视图代码应该是什么样的?
答案 0 :(得分:0)
GSP: 你需要包含jquery
<g:each in="${ parentlist}" var="FoundParent">
<button id=whatever
onclick="<g:remoteFunction controller="AppstackController"
action="getChildren" update="myBOX"
id="${FoundParent.id}" params="${[name:FoundParent.name,param2:'something']}"/>">
FoundParent.name</button>
</g:each>
<div id=myBox>
<g:each in="${childList}" var="FoundChild">
${FoundChild.name}
</g:each>
</div>
答案 1 :(得分:0)
我建议使用GET http请求。无论如何,您可以在之后添加AJAX请求。如何使用AJAX请参阅Grails文档。
class ParentController {
def index(){ redirect action: 'list' }
def list(){
[parents: Parent.list()]
}
def show(long id){
def parent = Parent.get(id)
if (!parent) { redirect: action:'list'; return }
//prepare model
model=[:]
model.parents = Parent.list()
model.parent = parent
render view:'list', model:model
}
}
GSP中的$ {parent?.children}给你一套孩子。您可以使用“g:each”标签。
<强> GSP 强>
<ul>
<g:each in="${parents}" var="p">
<li class="selectable ${ p==parent?'selected': ''}">
<g:link action="show" id="${p.id}">
${p.name}
</g:link>
</li>
</g:each>
</ul>
<ul>
<g:each in="${parent?.children}" var="child">
<li>
${child.name}
</li>
</g:each>
</ul>
<强> CSS 强>
li.selectable{}
li.selectable:HOVER{ border: 1px solid gray;}
li.selected{ border: 1px solid gray; background-color: silver;}