Ich entwickle eine Site mit Node.js + Express und benutze als View Engine Hogan.js.
Dies ist meine Datei app.js
:
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path');
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'hjs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(app.router);
app.use(require('less-middleware')({ src: __dirname + '/public' }));
app.use(express.static(path.join(__dirname, 'public')));
});
app.configure('development', function(){
app.use(express.errorHandler());
});
app.get('/', routes.index);
app.get('/about', routes.about);
app.get('/users', user.list);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
Die Datei /routes/index.js
lautet:
/*
* GET pages.
*/
exports.index = function(req, res){
res.render(
'index',
{
title: 'Home Page',
author: 'Bruce Wayne'
}
);
};
exports.about = function(req, res){
res.render(
'about',
{
title: 'About Page',
author: 'Bruce Wayne'
}
);
};
Im /views
Ordner gibt es:
| - part.hjs
| - index.hjs
| - cv.hjs
Die Datei part.hjs
lautet:
<h3>Hello {{ author }}</h3>
Die Datei index.hjs
lautet:
<h1>Title: {{ title }} </h1>
{{> part }}
Welcome to Gotham City.
Und die Datei about.hjs
lautet:
<h1>Title: {{ title }}</h1>
{{> part }}
I'm not Joker.
Ich habe zwei Fragen:
/routes/index.js
zu wiederholen?Viele Grüße, Vi.
Ich habe eine Lösung für die erste Frage gefunden.
Zuerst entfernte ich hjs
:
npm remove hjs
Dann habe ich das Paket hogan-express
installiert:
npm install hogan-express
Außerdem habe ich app.js
bearbeitet:
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path');
var app = express();
app.engine('html', require('hogan-express'));
app.enable('view cache');
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'html');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(app.router);
app.use(require('less-middleware')({ src: __dirname + '/public' }));
app.use(express.static(path.join(__dirname, 'public')));
});
app.configure('development', function(){
app.use(express.errorHandler());
});
app.get('/', routes.index);
app.get('/users', user.list);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
Und routes/index.js
:
exports.index = function(req, res) {
res.locals = {
title: 'Title',
};
return res.render(
'index',
{
partials:
{
part: 'part',
}
}
);
};
In /views
gibt es index.html
, part.html
. Die Datei part.html
enthält:
<h1>{{ title }}</h1>
Die Datei index.html
enthält:
{{> part}}
Hello world!
So funktioniert es gut.
Zumindest in Express 4+ funktionieren Partials einfach aus der Box. Sie können den Express-Generator (ab npm) mit der Option --hogan oder -H verwenden.
Danach müssen Sie der Render-Methode Partials hinzufügen:
router.get('/', function(req, res, next) {
res.render('index',
{
title: 'My Site',
partials: {header: 'header'}
});
});
Verwenden Sie dann in Ihrer Vorlage {{> xxx}}.
<body>
{{> header }}
<h1>{{ title }}</h1>
<p>Welcome to {{ title }}</p>
</body>
HINWEIS: Dies hat Header.hjs in Ansichten
Um Partials mit express + hogan zu verwenden, gehen Sie einfach wie folgt vor:
app.get('/yourRoute', function(req, res){
res.render('yourPartial', function(err,html){
var partialHTML = html;
res.render('yourMainView', { myPartial: partialHTML }, function(err,html){
res.send(html);
});
});
}
Und jetzt yourMainView.html:
<p>Something Something Something</p>
{{{partialHTML}}}
<p>Bla Bla Bla</p>
Beachten Sie das dreifache '{' anstelle des doppelten wie üblich! Dieser sagenhafte Hogan (Schnurrbart), um dies als HTML und nicht als String zu analysieren!
Das ist es.
Was Ihre Teilfrage betrifft, können Sie mit consolidate.js einfach Folgendes tun:
res.render('index', {
partials: {
part : 'path/to/part'
}
});
Ich würde mmm
anstelle von hjs
verwenden.
https://github.com/techhead/mmm
Haftungsausschluss: Ich habe das Paket geschrieben.
Ersetzen Sie einfach alle Vorkommen von hjs
durch mmm
und die Teilmerkmale beginnen zu arbeiten. Es gibt viele weitere Informationen und ein Beispiel unter dem Link oben.
Für Ihre andere Frage: Wenn Sie Eigenschaften für mehrere Ansichten freigeben möchten, haben Sie mehrere Optionen.
Wenn Sie res.render(name, options)
aufrufen, wird die options
tatsächlich mit res.locals
und app.locals
zusammengeführt, bevor sie an die Rendering-Engine übergeben wird. Um eine App-weite Eigenschaft festzulegen, können Sie sie einfach app.locals
zuweisen.
app.locals.title = "Default Title"; // Sets the default title for the application
Dieses Konzept gilt für fast jede Express 3 View Engine.
Speziell für mmm
finden Sie im Abschnitt unter Präsentationslogik weitere Möglichkeiten, um Werte an eine Vorlage oder einen Satz von Vorlagen zu binden.
Das ist ein Problem. Eine teilweise Unterstützung ist in Express 3 schwer zu bekommen.
Ihre beste Wette ist: https://github.com/visionmedia/consolidate.jsnpm install consolidate
Diese Patches verwenden unterschiedliche Methoden, um Partials für Hogan hinzuzufügen:
Leider verfügt die Engine nicht über einen systemeigenen Haken für Dateisystem-basierte Partials, daher denke ich, dass die Leute verwirrt sind, wie und wo Partials implementiert werden sollten. Ich bin mit der Implementierung von LinkedIn Dust.js gelandet, da bereits teilweise Unterstützung vorhanden war. Der Master hat sogar eine noch bessere Unterstützung und ich habe gestern einen Patch für relative Pfade eingereicht.
Josh