dust.js templates:如何异步渲染一个部分?

时间:2013-12-31 11:09:36

标签: javascript node.js dust.js

我有这个小尘埃模板:

    <div id="post-list">
        <h1>Posts</h1>
        {#posts}
            <h4><a href="{url}">{title}</a></h4>
            <p>by {author} on {date}</p>
            <p>{content}</p>
        {/posts}
    </div>

我试图在渲染时从postgresql数据库中异步获取帖子:

var data = {posts: 
        function(chunk, context, bodies) {
            return chunk.map(function(chunk) {                                            
                client.query("select * from blogposts", function (err, resultPosts) {
                    if (err) throw err;
                    return chunk.render(bodies.block, context.push(resultPosts.rows)).end();
                });                                   
            });
        }
}

不幸的是,这不起作用。模板呈现的唯一内容是by on

我该如何解决这个问题?感谢。

编辑:将chunk.render行设置为:

return chunk.render(bodies.block, context.push(resultPosts.rows[0])).end();

用于向我展示resultPosts列表中的第一篇文章。但我真的需要渲染整个列表。

3 个答案:

答案 0 :(得分:0)

事实证明,我必须循环查询行并逐段编写每个块。我不知道有没有更好的方法来做到这一点:

var data = {posts: 
        function(chunk, context, bodies) {
            return chunk.map(function(chunk) {                                            
                client.query("select * from blogposts", function (err, resultPosts) {
                    if (err) throw err;
                    for (index=0; index<resultPosts.rows.length; index++) {
                        chunk.render(bodies.block, context.push(resultPosts.rows[index]));
                    };
                    return chunk.end();
                });                                   
            });
        }
}

答案 1 :(得分:0)

您可以通过将项目放在{#。} {/。}块中来呈现列表,如下所示:

<div id="post-list">
        <h1>Posts</h1>
        {#posts}
            {#.}
               <h4><a href="{url}">{title}</a></h4>
               <p>by {author} on {date}</p>
               <p>{content}</p>
            {/.}
        {/posts}
</div>

有时我会遇到无法访问对象或数组项目的情况,除非我用{#。} {/。}包装模板。

答案 2 :(得分:0)

隐式执行迭代的正确方法是使用chunk.section而不是chunk.render。然后你可以自己跳过迭代。

return chunk.map(function(chunk) {
  client.query("select * from blogposts", function(err, resultPosts) {
    if (err) throw err;
    return chunk.section(resultPosts.rows, context, bodies).end();
  });
});