我一直在使用ColdFusion CFML几个月使用JSP几年后有我依然有麻烦在这门语言搞清楚一些事情。谷歌,CFDocs和Adobe已经与这个特定问题没有帮助。
我建立一个功能可显示的文章,其中评论也可以有子的评论下面的评论。我把所有的数据的输入和它看起来很棒。我使用返回结构的数组的查询时,它得到的文章,我回送通过阵列中的每个一级评论并附结构的数组每个注释的结构有孩子。
我已经通过书面模板循环并显示第一级注释列表中,但我想它本身递归调用,直到它已显示所有的每条评论的孩子的意见有孩子注释每个注释。我认为做到这一点的最好办法是为模板调用自身,同时传递给它的孩子意见的阵列。
我读过几篇文章,介绍如何创建一个CFModule
,但没有说是如何实际使用您传递给它的属性。下面是我试过的事情之一:
(在原始模板):
<h4>Comments</h4>
<div id="comments" name="comments">
<cfmodule template="comments.cfm" comments="#Variables.page.comments#">
</div>
(模板,我想最终调用递归):
<cfoutput>
<cfloop array = "#comments#" index = "comment">
<div>#comment.commenter_name# says</div>
<div>#comment.created#</div>
<div>#comment.content#</div>
</cfloop>
</cfoutput>
在第二个模板我不能只使用Variables.page.comments
因为模板是怎么回事递归调用自身;举例来说,我想在Variables.page.comments[2].comments
在下一次阵,后Variables.page.comments[2].comments[5].comments
时间等
您可以通过周围包裹你的渲染逻辑生成您的层次结构视图
<cfscript>
cfsavecontent variable="html" {
do logic stuff here
}
writeOutput(html);
<cfscript>
这将您的输出存储到一个变量。然后输出变量。
你也可以写一个递归函数来做到这一点,然后简单地输出返回的字符串,如下图所示。您可能要增加一些限制逻辑,所以你不输出的整个讨论一次,这取决于讨论有多大。
string function outputComments (
required array comments) {
var html = "";
for (var comment in arguments.comments) {
html &= "<li>#comment.message#";
if (comment.children.length) {
html &= outputComments(comment.children);
}
html &= "</li>";
}
if (html != "") {
html = "<ul>#html#</ul>";
}
return html;
}
writeOutput(outputComments(comments));
已经做了一堆这样的工作,你可能需要考虑提供您的意见/回复在某种JavaScript的Ajax驱动的部件的,使用返回JSON,你在哪里得到的评论页面或答复,评论数据的服务的时间。我写了工作这样一个Facebook风格的注释窗口小部件,而好处是,你不必担心谈话的大小。