2014-01-10 5 views
21

Ich habe eine globale Kopfzeile an einigen Orten verwendet und ich habe versucht, seine Position in einer Variablen zu definieren, die beim Rendern einer Vorlage übergeben werden konnte.Übergeben Variable an EJS gehören

Etwas wie:

var headerLocation = 'some/location/header.ejs'; 
res.render(viewDir + '/index', { 
     header: headerLocation 
    }); 

Und in einer Template-Datei:

<% include header %> 

Header der übergebene Wert mit der machen wird.

Es scheint nicht möglich zu sein, aber vielleicht habe ich etwas verpasst, also dachte ich, ich würde hier fragen.

EDIT:

Diese unten in den Kommentaren auf Antworten erwähnt, aber zusammenzufassen, ist dies nun in der Version 2 von EJS zur Verfügung.

Siehe hier: https://github.com/mde/ejs#includes und damit verbundene Diskussion hier: https://github.com/tj/ejs/issues/93

Antwort

6

Diese Funktion wurde hinzugefügt: Wenn es nicht Pfad (Datei nicht gefunden), wird als Variablenname ausgewertet. https://github.com/visionmedia/ejs/pull/156

+4

Dank. Ich bin auf https://github.com/visionmedia/ejs/issues/93 gestoßen, kurz nachdem ich diese Frage gestellt hatte. Während es eine Pull-Anfrage gibt, scheint sie noch nicht in npm erschienen zu sein. Hoffentlich wird es bald akzeptiert und veröffentlicht werden. Ich werde diese Antwort als richtig markieren, sobald dies geschieht, um andere, die hier landen könnten, nicht zu täuschen. Eine interessante Anmerkung, aus welchem ​​Grund auch immer, nur unter Windows, funktioniert mit dem globalen Knotenobjekt. Also <% include global.somepath%> funktioniert irgendwie. Nicht auf Mac oder Linux. Seltsames. –

+1

Denken Sie daran, die bug.push-Zeile mit dieser Zeile (im neuen Code) zu ändern: buf + = "'+ (function() {" + include + "})() +'"; (Kann mit .push Fehler verursachen) – Arthur

+0

Ich habe es gerade versucht, einen Pfad in einem var speichern und versucht, die var mit 'include' zu ​​verwenden, es immer noch versuchen, den var-Namen anstelle des Werts zu verwenden. EJS '1.0.0' – Vadorequest

4

Auch wenn seine eine alte Frage, es für andere willen zu beantworten.

Laut der Github-Dokumentation scheint EJS keine Blöcke zu kennen, nur zur Kompilierzeit. Da die Kompilierzeit enthalten ist, müssen Sie den Standort fest codieren.

So sind Sie links mit ein paar Fahnen vorbei und zu tun, wenn Kontrollen in der Kopfzeile oder den Header als html analysieren und übergeben es an allen Vorlagen ...

18

Hier ist ein Democode, der dynamische Includes ausführen kann.

Ansicht

<div flex class="main-container"> 
    <%- include(page) %> 
</div> 

Router

router.get('/', function (req, res, next) { 
    res.render('pages/index', { 
     page: 'home' 
    }); 
});