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