node.js - 使用 NodeJS、Express、Handlebars 和 expbhs 渲染 json 数据的服务器端
问题描述
所以我在服务器端使用 ExpressJS 和 Handlebars 以及使用 expbhs 视图引擎渲染一些 JSON 数据时遇到了麻烦。鉴于以下情况:
对象:
[
{
prop1: 'value',
prop2: 'value',
prop3: 'value',
prop4: 'value'
},
prop1: 'value',
prop2: 'value',
prop3: 'value',
prop4: 'value'
}
]
控制器:
exports.displayData = (req, res) => {
//assume valid json
res.render('myTemplate', {
obj
});
}
我的车把模板 (myTemplate.hbs) 看起来像这样:
{{#each this}}
<div class='section'>
<div id="{{prop1}}-section" >
<div>
<img src='{{prop2}}'>
</div>
<div>
<div class=''>
stuff{{prop3}}
</div>
<div>
other stuff: {{prop4}}
</div>
</div>
<div>
Data for: {{prop1}}
</div>
</div>
</div>
</div>
{{/each}}
这将呈现模板,但不会填充任何属性值。
解决方案
我意识到我在调用中将我的 obj 包装在另一个 obj 中res.render()
,所以我将调用更改为:
exports.displayData = (req, res) => {
//assume valid json
res.render('myTemplate', obj);
}
这部分解决了答案。我正在填充所有 obj 数据,但它也.section
<div>
使用空属性值渲染额外的 s。
所以我尝试了以下方法:
在我的控制器中,我将res.render()
json 参数更改为{ data: obj }
:
exports.displayData = (req, res) => {
//assume valid json
res.render('myTemplate', { data: obj });
}
在我的模板中,我将我的#each
块从更改this
为data
:
{{#each data}}
<div class='section'>
<div id="{{prop1}}-section" >
<div>
<img src='{{prop2}}'>
</div>
<div>
<div class=''>
stuff{{prop3}}
</div>
<div>
other stuff: {{prop4}}
</div>
</div>
<div>
Data for: {{prop1}}
</div>
</div>
</div>
</div>
{{/each}}
我的猜测是 exphbs 或 handlebarsobj
默认情况下会添加属性,并且这些属性是在this
渲染文档时传入的。这可以解释空<div>
的 s
我想出了这一点,因为我正计划将我的布局换成其他东西来进行特定的渲染,并且这样做看起来像这样:
exports.displayData = (req, res) => {
//assume valid json
res.render('myTemplate', {
data: obj,
layout: 'nonDefault'
});
}
推荐阅读
- javascript - Mobx 不会重新渲染 React 组件
- r - 如何解决这个绘图错误(xy.coords(x,y,xlabel,ylabel,log)中的错误:'x'和'y'长度不同)?
- ios - 有没有办法用 Decodable 忽略某些键,只提取它们的值?
- python - 如何在没有 Numpy 函数的 python 中显示 3 * 3 矩阵
- javascript - gql和styled.div后面的反引号是什么意思
- ios - 在真实设备上选择 PDF 时 iOS 文档选择器崩溃
- typescript - 无法设置threejs MeshBasicMaterial 实例的userData 属性
- docker - 当我在 kafka 中运行消费者脚本时,我收到错误 1 分区有领导代理没有匹配的侦听器
- python - 在字符串末尾增加一个数字
- python - 在 Python 中使用正则表达式从文本中提取列表