node.js express handlebars.js

node.js - ¿Cómo cambiar el diseño predeterminado en Express usando manubrios?



handlebars.js (4)

Del readme del manillar:

Hay dos formas de establecer un diseño predeterminado: configurar la propiedad defaultLayout del motor de visualización o configurar Express locals app.locals.layout.

El diseño en el que se debe representar una vista puede anularse por solicitud asignando un valor diferente a la solicitud de disposición local. Lo siguiente representará la vista "principal" sin diseño:

app.get(''/'', function (req, res, next) { res.render(''home'', {layout: false}); });

En caso de que quiera establecer el diseño predeterminado solo para una subroute específica, puede usar lo siguiente en la sección superior de su ruta:

router.all(''/*'', function (req, res, next) { req.app.locals.layout = ''admin''; // set your layout here next(); // pass control to the next handler });

También puede establecer el diseño predeterminado en la inicialización:

// Create `ExpressHandlebars` instance with a default layout. var hbs = exphbs.create({ defaultLayout: ''main'', helpers : helpers, // Uses multiple partials dirs, templates in "shared/templates/" are shared // with the client-side of the app (see below). partialsDir: [ ''shared/templates/'', ''views/partials/'' ] }); // Register `hbs` as our view engine using its bound `engine()` function. app.engine(''handlebars'', hbs.engine); app.set(''view engine'', ''handlebars'');

Estoy usando Express 4.9.0 y express-generator.

Platillo creado con un siguiente comando:

express --hbs projectname

El manubrio views/layout.hbs está utilizando views/layout.hbs de forma predeterminada como página maestra. Pero no puedo ver ninguna configuración en mi app.js para cambiar ese comportamiento.

pieza de código de mi app.js:

// view engine setup app.set(''views'', path.join(__dirname, ''views'')); app.set(''view engine'', ''hbs'');

  1. ¿Cómo puedo cambiar mi diseño predeterminado globalmente?
  2. ¿Qué sucede si quiero tener 2 o 3 diseños globales diferentes?

Esto debería funcionar ahora ...

npm install express-handlebars . ├── app.js └── views ├── home.handlebars └── layouts └── main.handlebars 2 directories, 3 files

app.js

var express = require(''express''); var exphbs = require(''express-handlebars''); var app = express(); app.engine(''handlebars'', exphbs({defaultLayout: ''main''})); app.set(''view engine'', ''handlebars''); app.get(''/'', function (req, res) { res.render(''home''); }); app.listen(3000);

views / layouts / main.handlebars:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Example App</title> </head> <body> {{{body}}} </body> </html>


Puede especificar qué diseño desea usar como parte de la llamada de renderizado. Si crea un nuevo diseño llamado other.hbs , puede hacer algo como:

res.render(''view'', { title: ''my other page'', layout: ''other'' });

Para anular esto para toda la aplicación, puede usar:

app.set(''view options'', { layout: ''other'' });


Si está utilizando el módulo ''express-handlebars'', entonces lo siguiente debería funcionar:

// ... app.set("views", __dirname ); exphbs.ExpressHandlebars.prototype.layoutsDir = ''path/to/directory/''; app.engine(''handlebars'', exphbs({defaultView: ''name-of-template''})); // ...

Llegué a esto buscando en la fuente del módulo, resulta que esta línea ...

// express-handlebars/lib/express-handlebars.js (line 55 in v1.2.2) ExpressHandlebars.prototype.layoutsDir = ''views/layouts/'';

... es lo que le da el comportamiento predeterminado de buscar siempre en ''{{lo que haya especificado}} / views / layouts /''

Entonces, esencialmente, si, tal vez, tiene una estructura de directorio diferente en mente o tiene alguna otra razón para anularla, puede usar la línea en mi ejemplo. Solo asegúrate de hacer esto antes de crear instancias de exphbs .

Si está utilizando algún otro módulo (no estoy seguro de cuáles son los que están disponibles), es probable que tengan una configuración similar que pueda anularse con un poco de jiggery-pokery (simplemente ejecute ''find'' en el contenido del archivo para ''vistas / diseños /''.

tenga en cuenta que estoy dejando ''app.set ("views", __dirname);'' como es para que guarde las plantillas en cualquier lugar en mi directorio de servidor y las renderice así:

res.render("moduleName/templateName");

Después de actualizar a v2.0.1, lo anterior no funcionará, en su lugar puede pasar el directorio predeterminado como un argumento como el siguiente:

var hbs = exphbs.create({ layoutsDir: ''app/server/'', ...