2013-11-03 39 views
3

有誰知道如何使Swig模板引擎的擴展標籤有條件或能夠使用傳遞的變量。帶有Express.js和Node.js的Swig的條件擴展標籤

取而代之的是:

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

我想做到這一點

{% extends layout %} 

雖然在express.js

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

任何人這樣做過這種渲染文件?使模板擴展有條件或傳遞變量而不是字符串。非常感謝幫助。

+0

看着代碼,我會說這是不可能的。 – robertklep

回答

2

我設法解決這個問題。至少我改變了幾行就得到了我想要的東西。

什麼本質上的解決方案確實是從renderFile函數傳遞參數localscompileFile功能,例如:

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/lib/swig.js文件的行524。當地人實質上成爲options

然後,我只是在同一個文件

if(options.layout) 
    parentName = options.layout; 

加入這個在行405雖然叫快遞的路由定義的res.render命令,我只需要添加一個佈局選項與相對佈局的位置。

res.render('index', { title: 'Express', layout: 'layouts/main.layout' }); 

這完全解決了我的問題。保持正常{% extend %}功能(當不覆蓋layout選項時),同時能夠動態設置佈局。

唯一的缺點是,layout成爲一個保留的選項,你可以重構這個不是我想的問題。

希望這可以幫助別人。兩行更改和兩行代碼使我可以實現動態佈局。性能是一樣的。

+0

這幫助了我很多。但是當模板被緩存時,我遇到了一個問題。我通過在'lib/swig.js'的'compile'函數中將佈局名稱添加到緩存鍵來解決此問題:if(options.layout && key!== null){key + = options.layout; }' –

2

Swig中不允許有條件擴展。這是爲了更快的模板渲染和更好的預編譯而設計的。當一個模板被解析時,它的父鏈一次被解析和編譯給給定的模板,在隨後不同的本地上下文運行模板時,刪除需要採取的任何必要步驟。

另一種解決方案,雖然不是很漂亮,是使用包括:把你的主要內容到一個文件中,但呈現兩個不同的文件,這取決於你想用什麼樣的佈局:

當你想佈局1,使這個文件:

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

而且,當您想佈局2,使這個文件:

{% extends "layout2.html" %} 
{% block body %} 
    {% include "content.html" %} 
{% endblock %} 
+0

是的,後來認識到這樣的東西可能是一個解決方案。 – robertklep

+0

感謝Paul的回答,我意識到這是當前設置的方式。它似乎很方便(基於身份驗證角色)可以爲同一內容呈現不同的佈局。將嘗試此並進一步調查,也許有另一種解決方案。我試圖防止重複的HTML .. –