3

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

而不是这个:

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

我想这样做

{% extends layout %}

在 express.js 中使用 this 渲染文件

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

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

4

2 回答 2

2

Swig 中不允许有条件的扩展。这是为了更快的模板渲染和更好的预编译而设计的。当一个模板被解析时,它的父链被一次性解析和编译给给定的模板,删除了每次模板在不同的本地上下文运行时需要采取的任何必要步骤。

另一种解决方案,虽然不是很漂亮,但是使用包括:将你的主要内容放到一个文件中,但是根据你想要使用的布局呈现两个单独的文件:

当你想要布局 1 时,渲染这个文件:

{% extends "layout1.html" %}
{% block body %}
    {% include "content.html" %}
{% endblock %}

而且,当你想要布局 2 时,渲染这个文件:

{% extends "layout2.html" %}
{% block body %}
    {% include "content.html" %}
{% endblock %}
于 2013-11-04T05:15:46.947 回答
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变成了一个保留选项,我认为你可以将它重构为不是问题。

希望这可以帮助某人。两行更改和两行代码使我可以进行动态布局。性能是一样的。

于 2013-11-04T21:49:52.430 回答