我有一个域名
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
答案 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}" />