繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM