Recursion 如何将数组作为属性传递给模板,然后使用数组,然后递归使用模板?

Recursion 如何将数组作为属性传递给模板,然后使用数组,然后递归使用模板?,recursion,coldfusion,cfml,Recursion,Coldfusion,Cfml,在使用JSP几年之后,我已经使用ColdFusion CFML几个月了,但在使用这种语言时仍然有一些问题。谷歌、CFDocs和Adobe在这个问题上毫无帮助 我正在构建一个功能,在文章下方显示评论,其中评论也可以包含子评论。我已经导入了所有的数据,看起来很棒。我使用的查询返回一个结构数组,它获取文章的每个一级注释,然后我循环返回该数组,并将一个结构数组附加到每个具有子级的注释结构 我已经编写了一个模板来循环并显示一级注释列表,但是我希望它在每个有子注释的注释上递归调用自己,直到它显示每个注释的所

在使用JSP几年之后,我已经使用ColdFusion CFML几个月了,但在使用这种语言时仍然有一些问题。谷歌、CFDocs和Adobe在这个问题上毫无帮助

我正在构建一个功能,在文章下方显示评论,其中评论也可以包含子评论。我已经导入了所有的数据,看起来很棒。我使用的查询返回一个结构数组,它获取文章的每个一级注释,然后我循环返回该数组,并将一个结构数组附加到每个具有子级的注释结构

我已经编写了一个模板来循环并显示一级注释列表,但是我希望它在每个有子注释的注释上递归调用自己,直到它显示每个注释的所有子注释为止。我认为实现这一点的最佳方法是模板在传递子注释数组时调用自身

我读过几篇文章解释如何创建
CFModule
,但没有一篇文章说明如何实际使用传递给它的属性。以下是我尝试过的一件事:

(在原始模板中):

注释
(在我希望最终递归调用的模板中):


#评论。评论人的名字说
#comment.created#
#评论内容#

我不能只在第二个模板中使用
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>

cfsavecontent variable=“html”{
在这里做逻辑的东西
}
写输出(html);
它将把输出存储到变量中。然后输出变量

您还可以编写一个递归函数来执行此操作,然后简单地输出返回的字符串,如下所示。您可能需要添加一些限制逻辑,以便不立即输出整个讨论,具体取决于讨论的规模

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));
string函数outputComments(
必需的数组注释){
var html=“”;
for(arguments.comments中的var注释){
html&=“
  • #comment.message”; if(comment.children.length){ html&=outputComments(comment.children); } html&=“
  • ”; } 如果(html!=“”){ html=“
      #html#
    ”; } 返回html; } 写输出(输出注释(注释));

    已经完成了一组这样的工作,您可能需要考虑在JavaScript Ajax驱动的小部件中呈现您的评论/回复,使用在JSON中返回评论数据的服务,在这里您可以一次获得评论或答复页面。我写了一个Facebook风格的评论小部件,它就是这样工作的,优点是你不必担心会话的大小。

    我想你不需要一个
    来做这个。您需要一个函数,
    .cfc
    ,一个ColdFusion组件。如果你在谷歌上搜索“coldfusion递归函数”,你会看到很多例子。您可能希望在cfmodule模板中使用“attributes.comments”作为对数组的引用。但是,如果您想递归地执行某些操作,您需要使用CFC方法。
    <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));