[英]Conditional extend tag for Swig with Express.js and Node.js
有没有人知道如何使Swig模板引擎的扩展标记有条件或能够使用传递的变量。
而不是这个:
{% extends '../layouts/layout.view' %}
我想这样做
{% extends layout %}
在express.js中使用此文件呈现文件
res.render('jobs/index', { title: 'Jobs', layout: '../layouts/layout.view' });
有没有人这样做过? 使模板扩展条件有条件或传递变量而不是字符串。 非常感谢帮助。
Swig中不允许有条件扩展。 这是为了更快的模板渲染和更好的预编译而设计的。 解析模板时,会为给定模板一次解析并编译其父链,从而删除每次后续模板运行时需要采取的必要步骤,并使用不同的本地上下文。
另一种解决方案,虽然不是很漂亮,但可以使用包括:将主要内容放入单个文件中,但渲染两个单独的文件,具体取决于您要使用的布局:
如果需要布局1,请渲染此文件:
{% extends "layout1.html" %}
{% block body %}
{% include "content.html" %}
{% endblock %}
并且,当您需要布局2时,渲染此文件:
{% extends "layout2.html" %}
{% block body %}
{% include "content.html" %}
{% endblock %}
我设法解决了这个问题。 至少我通过改变几行得到了我想要的东西。
解决方案基本上是将renderFile
函数中的locals
参数传递给compileFile
函数,如下所示:
this.renderFile = function (pathName, locals, cb) {
if (cb) {
exports.compileFile(pathName, locals, function (err, fn) {
if (err) {
cb(err);
return;
}
cb(null, fn(locals));
});
return;
}
return exports.compileFile(pathName, locals)(locals);
};
这发生在/lib/swig.js
文件的第514
行和第524
行。 当地人基本上成了options
然后我只在第405
行在同一个文件中添加了这个
if(options.layout)
parentName = options.layout;
在express的路由定义中调用res.render命令时,我只需添加一个布局选项,其中包含布局的相对位置。
res.render('index', { title: 'Express', layout: 'layouts/main.layout' });
这完全解决了我的问题。 维持正常的{% extend %}
功能(当没有用layout
选项覆盖它时),同时能够动态设置布局。
唯一的缺点是layout
成为一个保留的选项,你可以重构这个不是我认为的问题。
希望这有助于某人。 两行更改和两行代码使我可以进行动态布局。 表现是一样的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.