Как изменить макет по умолчанию в 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 разных глобальных макета?
Ответы
Ответ 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/',
...