0

我很难理解如何将从数据库中获取的对象传递给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);
4

2 回答 2

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();
            });
        });
    }
}

而不是 write 我不得不像 Alan 的回答那样调用 render 。

整个 db 调用必须包含在 return chunk.map 调用中才能工作。我还必须链接一个结束命令以将结果发送回流。

为什么需要这些调用在dust.js 指南(http://akdubya.github.io/dustjs/#guide)中有说明:

chunk.map 告诉 Dust 制造一个新块,在输出流中保留一个槽,然后继续渲染模板的其余部分。您必须(最终)在映射的块上调用 chunk.end() 以将其内容编织回流中。

这是 LinkedIn 指南页面中未解决的问题。

于 2013-10-31T07:33:58.290 回答
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灰尘测试运行它似乎得到了正确的答案。

希望有帮助,艾伦

于 2013-10-30T22:39:16.240 回答