javascript - express-ejs-layouts 忽略一些文件(不要给一些文件添加布局)
问题描述
我只想使用ejs layouts
一些文件(而不是整个项目)。但是使用express-ejs-layouts
它会对所有文件使用布局。这是代码的核心部分。
app.get("/page1",(req,res)=>{
res.render("p1");
});
app.get("/page2",(req,res)=>{
res.render("p2");
});
app.get("/page3",(req,res)=>{
// Don't add Layout file in this page
res.render("p3",{
layout:null
});
});
我在 stackoverflow 中发现,您可以通过传递object
akey
layout
及其value
作为布局文件的名称来使用多个布局{ layout : "layoutNumberOne" }
。但是将其值设置为undefined
ornull
不起作用。我想要的解决方案不是创建一个空的布局文件并将该文件的名称传递object
给可以工作的render()
函数,因为如果是这种情况,我将不得不{ layout : "emptyLayout" }
在我有很多的所有页面中指定. 我正在寻找可以将 a 添加layout
到特定的答案route
,以便路由中的所有请求都将具有此布局文件并且不会影响其他路径。我怎样才能做到这一点 ?
解决方案
你可以写一个这样的辅助函数:
function demo(route, view, data={}){
app.get(route, (req, res) => {
let options;
if(route === "/page3"){
options = {
layout: "blank-layout"
};
};
const locals = {
...data,
...options
};
res.render(view, locals)
});
}
并在您想要呈现页面时调用它:
demo("/page3", "p3", {anything: "whatever you want"})
在您希望传入一些动态数据以在模板中使用的可能事件中,此函数接受路由、视图文件和可选数据对象。
它设置您想要的路线,然后初始化一个名为“options”的变量,以便稍后在 if 语句给它一个值后传递给下面的“locals”对象。
然后,该函数将您的“路由”参数的值与您想要分配一些唯一选项的路由(在本例中为“/page3”)进行比较,如果结果为真,它会将“选项”变量设置为具有名为 layout 的属性和值为“blank-layout”的对象。该值与您要使用的布局文件的名称有关,因此请随意更改该值以满足您的需要。
最后,这个“选项”对象与您之前可能传入的“数据”对象合并(如果您没有传入一个,它将只使用一个空对象);合并两个对象的结果存储在“locals”变量中,现在包含您的数据对象和选项对象具有的每个属性。然后将此变量与视图文件一起传递给渲染函数。
请注意,您可以使用多个 if 语句来设置其他路由的选项
推荐阅读
- javascript - 脚本不导入文件以在画布中工作
- java - 计算输入数字的总和和平均值,并在 Eclipse 中对数字进行排序
- haproxy - HAProxy:省略 URI 的身份验证不起作用
- java - 从图库中选择照片后应用程序崩溃
- rust - Fn 的 trait impl 中的无约束类型参数
- html - 背景视频无法在移动设备上调整
- bootstrap-4 - 显示.bs.tab 事件未在电子应用程序中触发
- sql-server - 使用 BEGIN / END 组织 SQL 代码有什么危害吗?
- c++ - 即使声明支持也不能使用`std::filesystem`
- nginx - NGINX api 路由 404 未找到