0

是否有任何简单的解决方案可以让父显示视图中的子元素的g:pagination和 g:sortableColumn正常工作?

文档中很好地解释了如何为列表中的当前域执行分页和可排序列,并且它可以工作,但我无法让它在所描述的情况下工作。

编辑:我更新了示例

现在唯一不起作用的是分页。当我单击下一页链接时,列表消失并且 ${childrenistSize} 打印 0。

简单的例子:

父域

class Parent {

    String name

    static hasMany = [children: Children]

    static constraints = {
    }
}

子域

class Children {

    String first
    int number

    static belongsTo = [parent: Parent]

    static constraints = {
    }
}

父列表视图

<g:each in="${parentList}" var="parent">
    <tr>
        <td>${parent.name}</td>
        <td><g:link controller="parent" action="show" id="${parent.id}">Show</g:link></td>
    </tr>
</g:each>

父显示视图

<table>
    <thead>
        <tr>
            <g:sortableColumn property="first" title="First"/>
            <g:sortableColumn property="number" title="Number"/>
        <tr>
    </thead>
    <tbody>
        <g:each in="${childrenList}" var="child">
            <tr>
                <td>${child.first}</td>
                <td>${child.number}</td>
            </tr>
        </g:each>
    </tbody>
</table>
<g:paginate total="${childrenListSize}"/>

父控制器

class ParentController {

    def index() { }

    def list() {
        [parentList: Parent.list()]

    }

    def show() {
        params.max=3
        def parentInstance = Parent.get(params.id)
        def childrens = Children.createCriteria().list(params) {
          eq('parent', parentInstance)
        }
        [parentInstance : parentInstance , childrenList: childrens, childrenListSize: childrens.totalCount]
     }

}

一些 BootStrap 测试元素

    Parent parent1 = new Parent(name: "TestParent1")
    Parent parent2 = new Parent(name: "TestParent2")

    Children child1 = new Children(first: "Bob", number: "1")
    Children child2 = new Children(first: "John", number: "2")
    Children child3 = new Children(first: "Igor", number: "3")
    Children child4 = new Children(first: "Lucy", number: "4")
    Children child5 = new Children(first: "Lisa", number: "5")

    Children child6 = new Children(first: "Bob", number: "12")
    Children child7 = new Children(first: "John", number: "24")
    Children child8 = new Children(first: "Igor", number: "33")
    Children child9 = new Children(first: "Lucy", number: "42")

    parent1.addToChildren(child1).addToChildren(child2).addToChildren(child3).addToChildren(child4).addToChildren(child5)
    parent2.addToChildren(child6).addToChildren(child7).addToChildren(child8).addToChildren(child9)

    parent1.save()
    child1.save()
    child2.save()
    child3.save()
    child4.save()
    child5.save()
    parent2.save()
    child6.save()
    child7.save()
    child8.save()
    child9.save()
4

2 回答 2

0

问题是您没有children.name在 Children 域类中命名的列。您需要做的是在控制器中确定您必须按名称列排序。

我可以看到您在 Parent 的操作中显示了一个子列表show,并且在此操作中父级不可排序,因此将进行简单的更改:

def show() {
  def parentInstance = Parent.get(params.id)
  def childrens = Children.createCriteria().list(params) {
    eq('parent', parentInstance)
  }
  [parentInstance : parentInstance , childrenList: childrens, childrenListSize: childrens.totalCount]
}


<p>Parent: ${parentInstance.name}</p>
<table>
    <thead>
        <tr>
            <g:sortableColumn property="name" title="Name"/>
        <tr>
    </thead>
    <tbody>
        <g:each in="${childrenList}" var="child">
            <tr>
                <td>${child.name}</td>
            </tr>
        </g:each>
    </tbody>
</table>
<g:paginate max="1" total="${childrenListSize}"/>

请注意,我更改了它,property name因为它只是名称而不是 children.name。另外,我将参数传递给标准以进行排序。

我没有测试过这个,所以在任何地方都可能是一个错字。

于 2012-12-05T19:50:27.753 回答
0

好的,我已经回答了我的问题:

.createCryteria 只解决了列排序问题,所以需要在父控制器的 show 动作中添加这行代码:

def totalChildrenListSize = Children.findAllByParents(parentInstance, [params])

要获取该特定父级拥有的所有子级的列表,因此您可以通过调用 .size() ([...., totalChildrenListSize: totalChildrenListSize.size()] 方法来获取大小。

按照 Sergio 的建议,在 childrens 上调用 totalCount,然后为该显示操作设置 param.max,并添加 id 参数更改分页标签:

<g:paginate id="${parentInstance.id}" total="${totalChildrenListSize}"/>
于 2012-12-06T12:26:03.173 回答