带有Express.js和Node.js的Swig的条件扩展标记

时间:2013-11-03 22:45:11

标签: javascript node.js express swig-template

有没有人知道如何使Swig模板引擎的扩展标记有条件或能够使用传递的变量。

而不是:

{% extends '../layouts/layout.view' %}

我想这样做

{% extends layout %}

在express.js中使用此文件呈现文件

res.render('jobs/index', { title: 'Jobs', layout: '../layouts/layout.view' });

以前有人这样做过吗?使模板扩展条件有条件或传递变量而不是字符串。非常感谢帮助。

2 个答案:

答案 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成为保留选项,你可以重构这个不是我认为的问题。

希望这有助于某人。两行更改和两行代码使我可以进行动态布局。表现是一样的。