如何更改使用车把快速默认布局?
我正在使用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');
- 我怎样才能改变我的默认布局全球?
- 如果我想要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/', ...