把手 - 从局部向头部添加内容

tra*_*tur 1 partials node.js handlebars.js express-handlebars

express-handlebars在我的项目中使用并有以下问题:

问题 我希望能够<script>从视图内部调用的局部视图向我的整体视图头部添加其他此类标签。

例子:

风景

{{#layout/master}}
{{#*inline "head-block"}}
<script src="some/source/of/script">
{{/inline}}
...
{{>myPartial}}
{{/layout/master}}
Run Code Online (Sandbox Code Playgroud)

该视图正在扩展我用作布局的另一个部分(布局/主)。它通过内联部分符号将其内容添加到那个 head 块中,这很好用

部分“我的部分

<script src="another/script/src/bla"></script>

<h1> HELLO </h1>
Run Code Online (Sandbox Code Playgroud)

现在,我希望将其中的特定脚本标记添加到我的视图头块中。我尝试通过@root符号进行,但只能在那里引用上下文。不改变任何东西。

我知道我可以使用 jquery 或类似的方法来通过引用文档头等来添加内容。但我想知道这是否可以通过 Handlebars 实现。

我确实怀疑它以任何方式存在。但是,如果您有任何想法或建议,请务必按照我的方式发送!非常感谢!!!

tra*_*tur 5

更新

如果您在布局/视图中注入了不止一件东西,这将不起作用。由于这是在浏览器加载页面时发生的,它会创建某种竞争条件,帮助程序必须收集必须注入父文件的内容。如果它不够快,DOMTree 将在帮助程序解析之前构建。所以总而言之,这个解决方案不是我所希望的。我会研究更多并尝试找到更好的...


这是我如何做到的。感谢 Marcel Wasilewski 对帖子发表评论并指出我正确的事情!

我使用了handlebars-extend-block助手。我没有安装这个包,因为它不express-handlebars直接兼容(免责声明:有一个包说它是,但它只为我抛出错误)所以我只是使用他定义的助手,从github复制它们(我当然链接到他的 repo 并归功于他!)像这样:

var helpers = function() {

// ALL CREDIT FOR THIS CODE GOES TO: 
// https://www.npmjs.com/package/handlebars-extend-block
// https://github.com/defunctzombie/handlebars-extend-block

var blocks = Object.create(null);

return {

    extend: function (name,context) {
        var block = blocks[name];
        if (!block) {
            block = blocks[name] = [];
        }

        block.push(context.fn(this));
    },
    block: function (name) {
        var val = (blocks[name] || []).join('\n');

        // clear the block
        blocks[name] = [];
        return val;
    }
}
};
module.exports.helpers = helpers;    
Run Code Online (Sandbox Code Playgroud)

然后我要求它们进入我的快速车把实例,如下所示:

let hbsInstance = exphbs.create({
        extname: 'hbs',
        helpers: require('../folder/toHelpers/helpersFile').helpers() ,
        partialsDir: partialDirs
    });
Run Code Online (Sandbox Code Playgroud)

进入layout/master由我的视图 Partial 扩展的中央文件并将其添加到其<head>部分

{{{block 'layout-partial-hook'}}}
Run Code Online (Sandbox Code Playgroud)

(需要三个大括号,因为内容是 HTML。否则车把无法识别)

然后在部分本身中,我添加了如下内容:

{{#extend "layout-partial-hook"}}
    <link rel="stylesheet" href="/css/index.css"/>
{{/extend}}
Run Code Online (Sandbox Code Playgroud)

这就是诀窍!谢谢!!!