Pregunta

Tengo un servidor básico Express:

// server.js:
var Express = require('express');
app = Express.createServer();
app.configure(function(){
  app.set('views', Path.join(__dirname, 'views'));
  app.set('view engine', 'jade');
  app.set('view options');
});
app.get('/', function (request, response) {
  response.render('welcome', {
    locals: {some: 'Locals'}
  });
});

Con un diseño básico de jade:

// views/layout.jade:
!!! 5
html(lang='en')
  head
    title= pageTitle
  body
    h1= pageTitle
    aside(id="sidebar")= sidebarContent
    #content
      #{body}

Y una simple página:

# views/welcome.jade:
// How do I pass pageTitle and sidebarContent out to the layout from here?
p
  Welcome to my fine site!

(En Rails, esto podría ser algo así como content_for o una variable de instancia sencilla.)

¿Fue útil?

Solución

Con la punta por encima de unos dynamicHelpers, y la magia de los cierres, he encontrado una solución bastante elegante que funciona sin que implica el objeto de solicitud. El truco es envolver la variable página del título en un cierre que proporciona una función set () get () y alrededor de ella, y hacer que el objeto envoltorio el resultado de la dinámica ayudante page_title.

Crear un property.js:

exports.create = function () {
    var value = null;
    return {
        get: function () {
           return value;
        },
        set: function (new_value) {
           value = new_value;
        }
    };
}

Así que llamar a create () devuelve un objeto con un get () y set () método en él, que obtiene y pone la variable de cierre.

A continuación, en el código de configuración de la aplicación:

    var property = require("./property.js");
    app.dynamicHelpers ({
        page_title: function () {
         return property.create ();
        }
    });

Dado que el valor del ayudante dinámica es el resultado de llamar a su función, en su opinión y la plantilla, la variable page_title será el objeto envolvente con el get () y set () funciones.

En su opinión, a continuación, puede decir:

- page_title.set ("my specific page title");

Y en su diseño:

title= page_title.get()

Para simplificar esto un poco más allá, añadiendo esto a property.js:

exports.creator = function () {
    return function () {
        return exports.create();
    };
}

Le permite simplificar el bloque de declaración ayudantes dinámicas a esto:

        var property = require("./property.js");
        app.dynamicHelpers ({
            page_title: property.creator()
        });

Otros consejos

Express no tiene una noción preconcebida de "bloques" o lo que ellos llaman que en en los carriles, pero se puede utilizar una combinación de ayudantes (dynamicHelpers) y () para lograr algo similar http://expressjs.com/guide.html#app-helpers-obj-

Los locales aprobadas están disponibles tanto para el diseño y la vista de página, aunque

layout.jade

# the following function is a safe getter/setter for locals
- function pagevar(key, value) { var undef; return (value===undef) ? locals[key] || null : locals[key] = value; }
block config
  #intended as a non-rendered block so that locals can be overridden.
  # put your defaults here... - use append in the child view
!!!
html
  head
    title=pagevar('title')
    meta(name='description',content=pagevar('description'))
...

page.jade

append config
  - locals.title = 'override';
  - locals.description = 'override 2';
  - pagevars('somekey', 'some value');
...

Fácil peazy.

Se puede hacer eso a través de este pequeño fragmento.

prop.js:

var hash = {};
module.exports = function() {
    return {
        set: function(key, val) { hash[key] = val },
        get: function(key) { return hash[key] }
    };
};

server.js:

app.dynamicHelpers({ prop: require(__dirname + '/views/helpers/prop') });

Ver:

<% prop.set('foo', 'bar') %>

Diseño:

<%= prop.get('foo') %>

Pase en los locales: {some: 'Locals', pageTitle: 'Welcome!'}

Para Express 3 agnóstico plantilla, funciona bien con express-partials

app.use (req, res, next)->
  req.locals = {} unless req.locals

  res.locals.content_for = (k, v = null)->
    if !v
      req.locals[k]
    else
      req.locals[k] = v

  next()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top