EJS动态包含

9
我正在尝试使用EJS动态地包含我的某个部分。我这样渲染模板:

路由器

router.get('/', noteController.getNotes, (req, res, next) => {
    return res.render(template, {'page':'all'})
})

我正在尝试在此模板中包含一个部分,基于变量“page”。
template.ejs
<% include %><%= page %><% .ejs %>

然而,这并不起作用。我尝试了多种方法,但都没有成功。非常感谢任何帮助。
2个回答

15

简单来说:

<%- include(page) %>

或者如果它在 partials 文件夹中:

<%- include('partials/'+page) %>



P.S. 不要忘记将视图引擎声明为ejs

app.set('view engine', 'ejs');

来自官方文档

<%- 将未转义的值输出到模板中。

在使用include时,您可能希望使用原始输出标记(<%-)以避免HTML输出被双重转义。


当我尝试这样做时,我收到一个错误消息:"esc不是一个函数"。 - n0rd
@n0rd,我认为在您的部分文件“all”中有一个<%=语句,它尝试打印某个不存在(未定义)的变量,因此当您使用转义符<%=进行打印时,它会尝试调用该变量的.esc - num8er
我简化了我的原始代码以提出问题。我将更新我的问题,并附上所有代码和错误。请稍等片刻。 - n0rd
1
好的。再次检查我的代码后,最终它可以工作:<%- include('parts/'+page+'.ejs') %> 我想这只是因为我漏掉了“parts/”,这是我保存部件的文件夹。谢谢! - n0rd
1
@num8er 我得试试<%- include(file, {users: [用户数组], something: 'else'}) %>,没想过会这样。我只是传递了一个动态文件名,没有传递变量。 - richardwhitney
显示剩余6条评论

2
例如,用于登录页面。
app.get('/login', (req, res)=>{
  res.render('layout', {page: 'login'})
})

这是简单的layout.ejs布局:

在此处插入HTML代码

<body>
    <% include ./templates/nav %>
        <div class="row">
            <div class="col-md-2">
                <% include ./templates/leftbar %>
            </div>
            <div class="col-md-8">
                <%- include(page) %>
            </div>
            <div class="col-md-2">
                <% include ./templates/rightbar %>
            </div>
        </div>
        <% include ./templates/footer %>
</body>

login.ejs

<h1>Login</h1>
<form method="POST" action="/login">
    <div class="form-group">
        <label class="control-label">Username: </label>
        <input class="form-control" type="text" name="username" placeholder="username">
    </div>
    <div class="form-group">
        <label class="control-label">Password:</label>
        <input class="form-control" type="text" name="password" placeholder="password" />
    </div>
    <input class="btn btn-info" type="submit" value="Login">
</form>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接