我正在尝试使用嵌套的每张照片显示评论,但无法正常工作:
照片:{id,描述,所有者,链接}的数组
评论:{id,commentText,photoTarget}的数组// photoTraget是照片ID
index.js:
res.render('wall', { title: "Baker's Wall", photos, comments });
wall.hbs:
{{#each photos}}
{{@index}}: {{this}}
{{#each ../comments}}
{{#if_eq photoTarget @../index.id}}
<div class="titleR1">{{this.text}}</div>
{{/if_eq}}
{{/each}}
{{/each}}
app.js:
hbs.registerHelper('if_eq', function(a, b, opts) {
if(a == b)
return opts.fn(this);
else
return opts.inverse(this);
});
编辑
答案 0 :(得分:0)
我立即看到两个问题:
首先,您访问照片id
的方式是错误的。 @../index.id
试图在id
对象上查找index
属性,该对象比当前对象高一个上下文级别。 @index
是一个便利变量,当在#each
循环内时,Handlebars将保存当前的迭代索引。它是一个数字,因此没有id
属性。在父级上下文中查找照片的id
的正确方法是:../id
-告诉Handlebars提升一个上下文级别并获得id
属性。 (请注意,@
也不应使用。@
是Handlebars为其特殊的@data
变量使用的前缀。
第二,您的问题指出您的comments
对象每个都有一个“ commentText”属性,但是您的模板引用了{{this.text}}
。如果问题是正确的,则应为{{this.commentText}}
(或仅为{{commentText}}
。
我创建了一个fiddle供您参考。 (注意:我已经更改了模板中的HTML,以使呈现的结果更令人愉悦)
优化
您可能要考虑更新数据结构,以便每个photo
对象都有自己的comments
数组。这将使您的模板更加简单,因为您不需要if_eq
帮助器。此外,这将防止重复循环浏览所有注释。您当前的模板会为{em>每个 comments
在photo
中循环一次。通过循环comments
一次并将每个注释添加到其各自的photo
,您将在渲染时节省不必要的迭代。