【问题标题】:Call function from Dust template从 Dust 模板调用函数
【发布时间】:2014-06-26 01:59:29
【问题描述】:

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

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

我连接了所有这些东西,它看起来运行良好,但我现在遇到了第一个问题:我需要从 Dust 模板调用一个函数,代码如下:

{>layout/}

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

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

我是 nodejs 和灰尘的新手,所以我不确定问题是否仅与灰尘有关。有什么想法吗?

【问题讨论】:

  • 你最后决定的解决方案是什么?

标签: node.js dust.js


【解决方案1】:

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

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 格式的参数数组(使用单引号)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2018-07-10
    相关资源
    最近更新 更多