我很难理解如何将从数据库中提取的对象传递给dust.js模板。
假设我有一个模板:
{#person}
{name} - {title}
{/person}
我尝试设置这样的上下文:
var ctx = {
person: return chunk.map(function(chunk) {
database.person(12345, function(data) {
dust.nextTick(function() {
chunk.end(data); // What to really do here?
});
});
});
}
其中database.person从数据库中获取对象并将其传递给回调。
然后我会运行渲染功能:
res.render('person', ctx);
答案 0 :(得分:1)
正确的形式是:
var ctx = {
person: function(chunk, context, bodies) {
return chunk.map(function(chunk) {
database.person(1234, function(data) {
return chunk.render(bodies.block, context.push(data)).end();
});
});
}
}
而不是写,我必须像Alan的回答一样调用render。
整个db调用必须包含在返回的chunk.map调用中。我还必须链接一个结束命令,将结果发送回流。
为什么需要这些电话需要在dust.js指南(http://akdubya.github.io/dustjs/#guide)中说明:
chunk.map告诉Dust制作一个新的块,保留一个插槽 在继续渲染其余部分之前的输出流 模板。你必须(最终)在映射的块上调用chunk.end() 将其内容编织回流中。
这是LinkedIn指南页面中没有解决的问题。
答案 1 :(得分:0)
我假设您的db调用将返回json对象的行,例如下面的“数据”。
异步代码看起来不错。 chunk.write只会写出你提供的任何内容,因此你需要在上下文中传递数据,以便可以在模板中访问它。使用chunk.render而不是write。一个非异步的例子是:
{
"person": function(chunk, context, bodies) {
var data = {name:"Smith", title:"Mr"};
return chunk.render(bodies.block, context.push(data));
}
}
通过linkedin dust tests运行它似乎得到了正确的答案。
希望有所帮助, 艾伦