GSP页面中的递归

时间:2014-09-30 20:00:48

标签: grails groovy gsp

我有一个域名

class Node {   

    String nodeId
    String label

    Node parent    
}

在GSP页面中,我想从根开始并打印其所有子节点(注意我有父节点而不是子节点)。知道怎么做吗? 对不起,我很新,真的很困惑。我想打印从root(不是root)下来的所有东西,root也没有父(它的null)。所以我写了

<g:each in="${nodes}" var="node">
<g:if test="${node.parent!=null}">

  ${node.label}
  <g:render template="node" model="[nodes:Node.findAllByParent(node)]" />
</g:if>
</g:each>

在上面的代码中,不确定parent_node_intance应该是什么。节点列表以root身份开头。我不打算打印它,但从其他所有root作为父项开始。

node.gsp

<g:if test="${nodes}">
<ul>
  <g:each in="${nodes}" var="node">
    <li>
      ${node.label}
      <g:render template="node" model="[nodes:Node.findAllByParent(node)]" />
    </li>
  </g:each>
</ul>
</g:if>

获得以下错误,我确信这是由根

引起的
2014-10-02 12:28:21,693 [http-bio-8080-exec-1] ERROR errors.GrailsExceptionResolver  - NullPointerException occurred when processing request: [GET] /taxonomy - parameters:
outputFormat: concept
hierarchyId: lp
Cannot invoke method findAllByParent() on null object. Stacktrace follows:
Message: Error evaluating expression [[nodes:Node.findAllByParent(node)]] on line [11]: Cannot invoke method findAllByParent() on null object
    Line | Method
->>   11 | run       in C:/Users/U6021072/Documents/workspace-ggts-3.6.0.RELEASE/ae-and-sdx-analysis-ui/target/work/plugins/taxonomy-toolkit-for-grails-0.02-SNAPSHOT/grails-app/views/taxonomy/concept.gsp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Caused by NullPointerException: Cannot invoke method findAllByParent() on null object
->>   11 | doCall    in C__Users_U6021072_Documents_workspace_ggts_3_6_0_RELEASE_ae_and_sdx_analysis_ui_target_work_plugins_taxonomy_toolkit_for_grails_0_02_SNAPSHOT_grails_app_views_taxonomy_concept_gsp$_run_closure4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    198 | doFilter  in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter  in grails.plugin.cache.web.filter.AbstractFilter
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run       in java.lang.Thread

2 个答案:

答案 0 :(得分:4)

那么,您想要打印具有已知父节点的所有节点吗?

如下:

<g:each in="${Node.findAllByParent(parent_node_instance)}" var="node">
  ${node}<br>
</g:each>

但是既然你在谈论递归,我想你也想打印所有的后代。

创建_node.gsp模板:

<g:each in="${nodes}" var="node">
  ${node}<br>
  <g:render template="node" model="[nodes:Node.findAllByParent(node)]" />
</g:each>

并致电:

<g:render template="node" model="[nodes:Node.findAllByParent(parent_node_instance)]" />

您可以轻松地向模型添加深度变量以正确缩进每一代,或使用模板中的<ul><li>元素。

parent_node_instance是您要从中开始打印树的根,它可以是绝对根或树中的任何节点。

findAllByParent()是一个动态查找器功能。有关详细信息,请参阅http://grails.org/doc/latest/guide/GORM.html#finders

答案 1 :(得分:2)

您还可以使用@collection / @bean

_node.gsp

<div class="fancy nested">
  id:${it.nodeId} - label:${it.label}
  <g:render template="node" collection="${Node.findAllByParent(it.node)}" />
</div>

main.gsp

<g:render template="node" bean="${rootNode}" />