Подтвердить что ты не робот

Как изменить макет по умолчанию в express с помощью рулей?

Я использую Express 4.9.0 и express-generator.

Создан шаблон с следующей командой:

express --hbs projectname

Встроенные рули используют views/layout.hbs по умолчанию в качестве главной страницы. Но я не вижу никаких настроек в своем приложении app.js, чтобы изменить это поведение.

часть кода из моего приложения .js:

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

  • Как я могу изменить свой макет по умолчанию во всем мире?
  • Что делать, если я хочу иметь 2 или 3 разных глобальных макета?
4b9b3361

Ответ 1

Вы можете указать, какой макет вы хотите использовать как часть вызова рендеринга. Если вы создадите новый макет под названием other.hbs, вы можете сделать что-то вроде:

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

Чтобы переопределить это для всего приложения, вы можете использовать:

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

Ответ 2

Из ручек readme:

Существует два способа установки макета по умолчанию: настройка свойства defaultLayout для механизма просмотра или установка локальных адресов Express.locals.layout.

Макет, в который нужно визуализировать представление, может быть переопределен для каждого запроса, назначив другое значение локальному запросу макета. Ниже будет отображаться "домашний" вид без макета:

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

Если вы хотите установить макет по умолчанию только для определенного подпрограммы, вы можете использовать следующее в верхней части вашего маршрута:

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

Вы также можете установить макет по умолчанию при инициализации:

// 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');

Ответ 3

Если вы используете модуль "express-handlebars", тогда должно работать следующее:

// ...
app.set("views", __dirname );

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

// ...

Я пришел к этому, копаясь в источнике модуля, выясняется, что эта строка...

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

... это то, что дает поведение по умолчанию, всегда смотрящее в '{{независимо от того, что вы указали}}/views/layouts/'

Итак, по существу - если, возможно, у вас есть другая структура dir или у вас есть другая причина переопределить ее, вы можете использовать строку в моем примере. Просто убедитесь, что вы делаете это до, вы создаете exphbs.

Если вы используете какой-либо другой модуль (я не уверен, что там есть), вероятно, что у них есть аналогичная настройка, которую можно переопределить с помощью немного jiggery-pokery (просто запустите "find" на содержимое файла для 'views/layouts/'.

Заметьте, что я оставляю 'app.set( "views", __dirname); так как я сохраняю шаблоны где-нибудь в своем каталоге сервера и отображаю их так:

res.render("moduleName/templateName");

После обновления до версии 2.0.1 выше не будет работать, вместо этого вы можете передать каталог по умолчанию в качестве аргумента, как показано ниже:

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