有没有人知道如何使Swig模板引擎的扩展标记有条件或能够使用传递的变量。
而不是:
{% extends '../layouts/layout.view' %}
我想这样做
{% extends layout %}
在express.js中使用此文件呈现文件
res.render('jobs/index', { title: 'Jobs', layout: '../layouts/layout.view' });
以前有人这样做过吗?使模板扩展条件有条件或传递变量而不是字符串。非常感谢帮助。
答案 0 :(得分:2)
Swig中不允许有条件扩展。这是为了更快的模板渲染和更好的预编译而设计的。解析模板时,会为给定模板一次解析并编译它的父链,删除每次后续模板运行时需要采取的任何必要步骤。
另一种解决方案,虽然不是很漂亮,但可以使用包括:将您的主要内容放入单个文件中,但渲染两个单独的文件,具体取决于您要使用的布局:
如果需要布局1,请渲染此文件:
{% extends "layout1.html" %}
{% block body %}
{% include "content.html" %}
{% endblock %}
而且,当你想要布局2时,渲染这个文件:
{% extends "layout2.html" %}
{% block body %}
{% include "content.html" %}
{% endblock %}
答案 1 :(得分:2)
我设法解决了这个问题。至少我通过改变几行得到了我想要的东西。
解决方案基本上是将locals
参数从renderFile
函数传递到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);
};
这发生在514
文件的行524
和行/lib/swig.js
上。当地人基本上变成options
然后我只在同一个文件
中的405
行添加了这个
if(options.layout)
parentName = options.layout;
在express的路由定义中调用res.render命令时,我只需添加一个布局选项,其中包含布局的相对位置。
res.render('index', { title: 'Express', layout: 'layouts/main.layout' });
这完全解决了我的问题。在能够动态设置布局的同时,维护正常的{% extend %}
功能(在未使用layout
选项覆盖时)。
唯一的缺点是layout
成为保留选项,你可以重构这个不是我认为的问题。
希望这有助于某人。两行更改和两行代码使我可以进行动态布局。表现是一样的。