2013-06-09 5 views
5

Wie kann ich mehrere .ejs Dateien in verschachtelter Form rendern?Wie Rendern mehrerer .ejs-Dateien in verschachtelter Form in Node.js und Express?

So habe ich eine folgende Datei:

var mysql = require('mysql'); 
var ejs = require('ejs'); 
exports.index = function(req, res){ 
    if (req.method=='POST'){ 
     var connection = mysql.createConnection({user:'root', password:'root', database:'testdb'}); 
     var name = req.param('name'); 
     connection.query('select * from table_name where name = ?', name, function(err, rows, fields){ 
      if(err) throw err; 
      res.render('index', { 
       title: 'title', content: res.render('index2', {data:rows}) 
      }); 
     }); 
    } 
}); 

Wo index.ejs besteht aus sehr einfachen HTML-Tag (sagen html, Kopf, Körper, und ein p-Tag) und haben <%- content %> darin, wo Inhalte angenommen wird, von einer anderen .ejs-Datei gerendert werden, die kein html-, head- oder body-Tag enthält und von der nur ein Inhalt und ein Titel gerendert werden. Wenn ich jedoch auf diese Datei per POST-Anfrage zugegriffen und versucht habe, Dateien zu rendern und dann die ausgegebene HTML-Datei aus meinem Browser ausgecheckt, bestand der Inhalt nur aus index2.ejs Datei, was bedeutet, dass es keine HTML-, Körper-, Kopf-Tag.

Also was fehlt mir? Und wenn ich eine Javascript-Bibliothek von <script src='some_file.js'></script> aufnehmen möchte, sollte ich eine andere Rendering-Eigenschaft hinzufügen, wenn ich versuche, in index2.ejs Datei zu rendern ... oder?

Danke.

Antwort

9

Erstens, ich glaube, Sie sind verwirrt, wie res.render arbeitet. Gemäß den docs:

res.render (view, [Einwohner], Rückruf)

Render eine Ansicht mit einem Rückruf mit dem wiedergegebenen String reagiert.

was erklärt, warum Sie nur den Inhalt von index2.ejs in Ihrer HTML-Seite zu sehen.


Jetzt gibt es mehrere Möglichkeiten, um Ihr Ziel zu erreichen, das Nischen Ansichten in Ansichten ist. Ab Express 3.x müssen Sie include verwenden. In diesem Fall können Sie Ihre Ansichten wie folgt umschreiben:
1- Definieren Sie eine header.ejs-Datei, die wie folgt aussehen würde example.
2- Definieren Sie eine Fußzeile.ejs. Das würde wie dieses andere example aussehen.
3- In Ihrem index2.ejs, umfassen diese beiden Dateien, wie folgt aus:

<% include header %> 
    //The HTML of your index2.ejs 
    //You can add some reusable views, like, say, a submit button above the footer 
    <% include reusable_views/submit %> 
<% include footer %> 

Ein zweites Verfahren ist ejs-locals, zu verwenden, die Sie mit einer Ansicht einfügen können nur ihren Pfad angeben:

res.render('index', { 
       title: 'title', 
       content: 'index2', 
       data:rows 
      }); 

Und in Ihrem index1.ejs, müssen Sie:

<html><head> 
<title><%= title %></title></head> 
<body><p> 
<%- partial('index2',{}) %> 
</p></body></html> 

der Vorteil dieser Methode ist, Sie zusätzliche Werte zu Ihrer Sicht passieren kann, uns das zusätzliche Objekt. Weitere Informationen finden Sie auf der ejs-locals github-Seite.

1

gut für Standard-HTML wie head, footer, sidebars oder was auch immer .. es Partials ist das Beispiel alles erklärt ..