Node.js - EJS - einschließlich eines Teils


73

Ich versuche, Embedded Javascript Renderer für den Knoten zu verwenden: https://github.com/visionmedia/ejs

Ich möchte wissen, wie ich eine andere Ansichtsdatei (teilweise) in eine .ejs-Ansichtsdatei aufnehmen kann.


3
Ich glaube, das Teilsystem ist tatsächlich ein Teil von ExpressJS. Verwenden Sie das Express-Framework?
Zikes

Nein, das benutze ich nicht. Ich muss diesen Weg wahrscheinlich gehen, wenn es nicht nur mit einem Template-Motor möglich ist.
Jeffreyrey

Antworten:


148

Mit Express 3.0:

<%- include myview.ejs %>

Der Pfad ist relativ zu dem Aufrufer, der die Datei enthält, und nicht zu dem mit eingestellten Ansichtenverzeichnis app.set("views", "path/to/views") .

EJS enthält

(Update: Die neueste Syntax für ejs v3.0.1 ist <%- include('myview.ejs') %>)


2
Dies sollte die richtige Antwort sein, da der Entwickler von ejs / express den Code aktualisiert hat.
Joshua

2
In ejs2 hatte ich so einen Code, der so aussah und funktionierte. <% include myview.ejs%> In ejs3 muss es so aussehen. <% - include ('myview.ejs')%> Wie viele Stunden habe ich gebraucht, um zu erkennen, dass ich den Bindestrich am Anfang hinzufügen musste? (Fügen Sie nur diesen Kommentar hinzu, falls jemand anderes in der gleichen Situation ihn liest.)
Griffin

<%- include('partials/footer') %>funktioniert auch
Hos Mercury

20

In Express habe 4.xich Folgendes zum Laden verwendet ejs:

  var path = require('path');

  // Set the default templating engine to ejs
  app.set('view engine', 'ejs');
  app.set('views', path.join(__dirname, 'views'));

  // The views/index.ejs exists in the app directory
  app.get('/hello', function (req, res) {
    res.render('index', {title: 'title'});
  });

Dann brauchen Sie nur zwei Dateien, damit es funktioniert - views/index.ejs:

<%- include partials/navigation.ejs %>

Und die views/partials/navigation.ejs:

<ul><li class="active">...</li>...</ul>

Sie können Express auch anweisen, es ejsfür HTML-Vorlagen zu verwenden:

var path = require('path');
var EJS  = require('ejs');

app.engine('html', EJS.renderFile);

// Set the default templating engine to ejs
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));

// The views/index.html exists in the app directory
app.get('/hello', function (req, res) {
  res.render('index.html', {title: 'title'});
});

Schließlich können Sie auch das ejsLayoutmodul verwenden:

var EJSLayout = require('express-ejs-layouts');
app.use(EJSLayout);

Dies wird das views/layout.ejsals Ihr Layout verwenden.


2
Ich habe einen Fehler vermisst. Ich muss ihn wie <% - include ('partials / navbar.ejs')%>
rickvian

18

Funktioniert mit Express 4.x:

Der richtige Weg partials in die Vorlage aufgenommen werden gemäß dieser sollte man verwenden:

<%- include('partials/youFileName.ejs') %>.

Du benutzt:

<% include partials/yourFileName.ejs %>

das ist veraltet.


10

Ab Express 4.x.

app.js.

// above is all your node requires

// view engine setup
app.set('views', path.join(__dirname, 'views')); <-- ./views has all your .ejs files
app.set('view engine', 'ejs');

error.ejs

<!-- because ejs knows your root directory for views, you can navigate to the ./base directory and select the header.ejs file and include it -->

<% include ./base/header %> 
<h1> Other mark up here </h1>
<% include ./base/footer %>

3

Express 3.x unterstützt teilweise nicht mehr. Entsprechend dem Beitrag ejs 'Teil ist nicht definiert' können Sie das Schlüsselwort "include" in EJS verwenden, um die entfernte Teilfunktionalität zu ersetzen.


1
Schauen Sie sich ejs-local an, um Unterstützung für Express 3 zu erhalten.
UpTheCreek


2

app.js hinzufügen

app.set('view engine','ejs')

Fügen Sie Ihre Teildatei (ejs) in Ansichten / Partials hinzu

in index.ejs

<%- include('partials/header.ejs') %>

0

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/css/bootstrap.min.css" integrity="sha384-Zug+QiDoJOrZ5t4lssLdxGhVrurbmBWopoEl+M6BdEfwnCJZtKxi1KgxUyJq13dy" crossorigin="anonymous">

 <form method="post" class="mt-3">
        <div class="form-group col-md-4">
          <input type="text" class="form-control form-control-lg" id="plantName" name="plantName" placeholder="plantName">
        </div>
        <div class="form-group col-md-4">
          <input type="text" class="form-control form-control-lg" id="price" name="price" placeholder="price">
        </div>
        <div class="form-group col-md-4">
            <input type="text" class="form-control form-control-lg" id="harvestTime" name="harvestTime" placeholder="time to harvest">
          </div>
        <button type="submit" class="btn btn-primary btn-lg col-md-4">Submit</button>
      </form>

<form method="post">
        <table class="table table-striped table-responsive-md">
            <thead>
            <tr>
                <th scope="col">Id</th>
                <th scope="col">FarmName</th>
                <th scope="col">Player Name</th>
                <th scope="col">Birthday Date</th>
                <th scope="col">Money</th>
                <th scope="col">Day Played</th>
                <th scope="col">Actions</th>
            </tr>
            </thead>
            <tbody>
            <%for (let i = 0; i < farms.length; i++) {%>
                 <tr>
                    <td><%= farms[i]['id'] %></td>
                    <td><%= farms[i]['farmName'] %></td>
                    <td><%= farms[i]['playerName'] %></td>
                    <td><%= farms[i]['birthDayDate'] %></td>
                    <td><%= farms[i]['money'] %></td>
                    <td><%= farms[i]['dayPlayed'] %></td>
                    <td><a href="<%=`/farms/${farms[i]['id']}`%>">Look at Farm</a></td>
                </tr>
            <%}%>
        </table>
    </form>


Willkommen bei Stack Overflow, Enividu Indonesia. Bitte erwägen Sie, mehr Details zu Ihrer Antwort hinzuzufügen, anstatt nur den Code.
Igor Escodro

-3

EJS allein erlaubt derzeit keine partiellen Ansichten. Express tut.


6
Veraltete Informationen. Neue Version unterstützt es gemäß Kommentar von @pkyeck
Joshua
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.