从Dust模板调用函数

时间:2014-06-23 14:26:09

标签: node.js dust.js

我正在开发一个简单的网站,我需要从数据库中检索对象列表。我想尝试nodejs,经过几天的阅读和测试,我终于决定使用这个配置:

  • 服务器技术: Nodejs + Express
  • 模板引擎: Dust
  • 数据库/数据来源:解析

我连接了所有这些东西并且似乎运行良好,但我现在遇到了第一个问题:我需要从Dust模板调用一个函数,这是代码:

{>layout/}

{<content}
    <ul>
        {#photos}
        <li>{photo.get("name")}{~n}</li>
        {/photos}
    </ul>                
{/content} 

但它不起作用,因为它打印出 {photo.get(&#34; name&#34;)} (字面意思),而不是打印每张照片的名称。使用Parse的查询正常工作,因为我可以通过console.log()看到加载的对象。

我对nodejs和dust都很新,所以我不确定这个问题只与尘埃有关。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

除了创建助手之外,我没有任何其他解决方案:

var dust = require('dustjs-linkedin');

dust.helpers.exec = function(chunk, context, bodies, params) {
    var args = JSON.parse(params.args.replace(/'/g, '"'));
    var object = context.stack.head;

    params.func.split('.').some(function(property) {
        if (typeof(object[property]) === "function") {
             var result = object[property].apply(object, args);
             chunk.write(result);
             return true;
        } else {
            object = object[property];
            return false;
        }
    })

    return chunk;
};

假设我们有以下数据:

app.get('/dust-test', function(req, res) {

    function Photo(name) {
        var props = {'name': name};

        this.get = function(prop) {
            return props[prop];
        }
    }

    var photos = ['foo', 'bar', 'nanana'].map(function(name) {
        return new Photo(name);
    })

    res.render("dust-test", {
        photo: new Photo('me'),
        photos: photos
    });
});

用法:

<li>{@exec func="photo.get" args="['name']" /}</li>

{#photo}
    <li>{@exec func="get" args="['name']" /}</li>
{/photo}

<ul>
    {#photos}
    <li>{@exec func="get" args="['name']" /}{~n}</li>
    {/photos}
</ul>

其中args - 是json格式的参数数组(使用单引号)