2014-11-11 4 views
39

Я использую Express 4.9.0 и экспресс-генератор.Как изменить макет по умолчанию в express с помощью ручек?

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

express --hbs projectname 

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

кусок кода из моего app.js:

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

  1. Как я могу изменить свое расположение по умолчанию в глобальном масштабе?
  2. Что делать, если я хочу иметь 2 или 3 разных глобальных макета?
+0

я хочу поблагодарить вас Heihachi за расклеивание этот вопрос, я был поиск способа интеграции рулей w/Express, но не мог найти хороший пример, глядя на командную строку экспресс-генератора, заставив меня вспомнить, как можно использовать hbs, и дал мне простую, но хорошую демонстрацию, которую я не мог найти онлайн. Благодарю. – Bharat

ответ

73

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

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

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

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

Спасибо, но не могу ли я сделать это по всему миру? – Heihachi

+1

@Heihachi Я обновил ответ, включив глобальный вариант. –

+0

вот и все! Если я хочу еще несколько глобальных макетов, я просто дублирую строку с app.set(), правильно? – Heihachi

2

Если вы с помощью «экспресс модуль -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/'; 

... это то, что дает поведение по умолчанию всегда смотрит в «{{все, что вы указали}}/просмотров/макеты /»

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

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

Отметьте, что я оставляю «app.set» («views», __dirname); «так же, как если бы я хранил шаблоны в любом месте своего каталога сервера и отображал их так :

res.render("moduleName/templateName"); 

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

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

От рулей ридй:

Есть два способа установить раскладку по умолчанию: настройка defaultLayout свойства представления двигателя или настройку Экспресса местных app.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'); 
Смежные вопросы