如何更改使用车把快速默认布局?

我正在使用Express 4.9.0和快速发生器。

使用以下命令创build样板:

express --hbs projectname 

内置的handlebars默认使用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个不同的全球布局呢?

您可以指定要作为渲染调用的一部分使用的布局。 如果您创build一个名为other.hbs的新布局,则可以执行如下操作:

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

要覆盖整个应用程序的这个,你可以使用:

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

如果在布局上的把手文档 :

[…]

有两种方法可以设置默认布局:configuration视图引擎的defaultLayout属性,或者设置Express locals app.locals.layout。

通过向本地布局请求分配不同的值,可以根据请求覆盖视图应该呈现的布局。 以下将渲染没有布局的“home”视图:

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

如果你使用“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 /'

所以基本上 – 如果你也许有不同的目录结构或有其他理由来覆盖它,你可以通过我的例子中的行。 只要确保实例化exphbs 之前做到这一点

如果你正在使用一些其他的模块(我不确定哪些模块在那里),很可能它们有一些类似的设置,可以用一些jiggery-pokery覆盖(只需在文件内容中运行一个“find” '视图/布局/'。

注意我离开'app.set(“views”,__dirname);' 这样我就可以在我的服务器目录中的任何位置保存模板,并像下面这样渲染它们:

 res.render("moduleName/templateName"); 

在更新到v2.0.1之后上面的代码不起作用,你可以像下面那样传递默认目录作为参数:

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