【问题标题】:Handlebars helper to retrieve the basename of the file in which it is usedHandlebars helper 检索使用它的文件的基本名称
【发布时间】:2013-03-24 16:52:32
【问题描述】:

我正在寻找一种方法来创建一个帮助程序,该帮助程序仅呈现放置模板的文件的基本名称,并且不需要任何其他参数,例如:{{ basename }}

换句话说,如果我在两个部分中使用这个助手,比如header.hbsnavbar.hbs,我希望每个部分的名称都会在输出中呈现在它们被使用的任何地方。

我已经找了好几个小时,但找不到任何答案。任何方向或指导将不胜感激。

【问题讨论】:

  • 我怀疑 Handlebars 甚至会在你的助手运行时知道文件名(如果有文件名知道的话)。您可能需要破解核心 Handlebars 代码,并说破解可能比您想要的要大。
  • 这就是我摆弄了一段时间后的怀疑,但我希望有一些我不知道的隐藏的超级功能......对此:“如果有一个文件名要知道”,我试图想出一种方法来“使”具有节点路径/fs 的车把知道这一点。似乎不可能
  • 问题(可能)在于将某些东西放入 Handlebars 的两种方法是 Handlebars.compileHandlebars.registerPartial,它们都不知道文件,他们只知道字符串。我不能保证没有魔法捷径,但似乎不太可能。
  • 这可能会或可能不会有所作为,但我正在使用 Grunt.js 和 assemble (github.com/assemble/assemble)。感谢您的洞察力,尽管@mu 太短了,非常有帮助。

标签: node.js templates handlebars.js helper helpers


【解决方案1】:

在不了解您的设置的情况下,这是一种方法。

你需要在你的渲染函数中注册一个助手。然后您将调用渲染而不是编译。请注意,以下内容适用于后端,但您可以轻松地将其适应您的环境。

Handlebars 对您的环境没有概念,因此您需要在某个地方全局设置它。

exports.render = function (name, req, context) {
    if (isBrowser()) {
        throw new Error('Render cannot be called client-side.');
    }
    handlebars.registerHelper('basename', function() {
        var host = globalBasenameSetFromEnvironment;
        return  host;
    });
    if (!handlebars.templates[name]) {
        throw new Error('Template Not Found: ' + name);
    }
    return handlebars.templates[name](context);
};

【讨论】:

  • @Hatchare 我认为 jonschlinkert 指的是使用节点 path.basename('header.hbs') 在他的文件中获取类似 'header' 的内容。我是否正确地假设您正在考虑诸如 url 主机名或其他文件的基本路径之类的东西?我认为您的渲染函数可能对仅返回传递的名称有用(应该是部分名称,对吗?)。
  • 所以他可以做类似var host = name; 的事情来传递变量,当然摆脱.hbs,并将主机变量更改为更有意义的东西。
【解决方案2】:

这是渲染文件时需要在上下文中公开的内容。

例如,假设我们在文件路径“some/template.hbs”中有一个模板,它在

中有如下内容
Basename is: "{{basename}}"

我们可以这样渲染:

var fs = require('fs');
var hbs = require('handlebars');

var filepath = 'some/template.hbs';
var tmpl = fs.readFileSync(filepath, 'utf8');

var fn = hbs.compile(tmpl);
var str = fn({
  path: filepath,
  basename: path.basename(filepath)
});
console.log(str);
// Basename is: "template.hbs"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    相关资源
    最近更新 更多