【问题标题】:Load partial from param从参数加载部分
【发布时间】:2014-06-04 20:45:53
【问题描述】:

我最近开始使用 node.js 进行开发,到目前为止,我已经掌握了基础知识(路由、身份验证、视图等)。我现在想更好地组织我的模板,所以我想找到一种方法来根据参数加载部分。

在我的应用中,我有这个;

freeway.get('/login', function(req,res){
        res.render('login');
    });

我想要的是能够传入一个指向部分的参数并让我的视图渲染它,就像这样;

freeway.get('/login', function(req,res){
        res.render('index', {reqpage: "login"});
    });

我的索引视图包含我的主要模板,该模板主要由硬编码的部分组成(尽管有些有一些显示逻辑,例如用户登录时的用户特定元素)。我想进一步扩展它并动态地将部分从我的应用程序传递到索引视图,而不是有几个基本上重复的模板,内容只有轻微的变化。

我尝试了以下但没有成功;

1) <%= reqpage %>

2) <% include reqpage %>

3)<% include <%= reqpage %> %>

在任何情况下,它们要么导致应用程序引发错误(暗示未找到部分),要么将路径呈现为字符串。我什至尝试了以下方法,希望它能将其解释为呈现部分的代码,但可惜没有这样的运气;

res.render('index', {reqpage: "<% include login %>"});

有什么想法,或者 Express + EJS 的设计根本没有考虑到这一点?

【问题讨论】:

  • 已经有一个issue 与此有关。 cmets中有一些解决方案。

标签: node.js express ejs


【解决方案1】:

感谢 mscdex (https://github.com/visionmedia/ejs/issues/93) 提供的链接,解决方案很简单,但需要您直接编辑 EJS lib 文件。

为了其他人试图找到解决方案,我将在此处进行解释。此代码适用于 EJS 1.0.0 版本。

1)在node_modules\ejs\ejs.js第215行,需要添加以下内容;

if(options[name])
    var path = resolveInclude(options[name], filename);
else

else 之后的行将显示为 var path = resolveInclude(name, filename);

2) node_modules\ejs\lib\ejs.js 的第 163 行,应添加与上述相同的代码。

3) 在你的 node.js 应用程序路由中,然后添加一个指向你希望渲染的部分的变量;

res.render('index', {reqpage: "login"});

4) 最后,在您的索引视图中(根据此示例),您应该添加一个标准包含;

<% include reqpage %>

考虑扩展

  1. 或许可以考虑在 EJS 中复制整个未修改的代码函数,并将其从 include 更改为 dynamic,以便您轻松识别视图中哪些部分是静态的,哪些作为变量传入。

此更改就像在 EJS 库中将其从“包含”更改为“动态”一样简单。由于 EJS 检测“include”的方式,如果不重构代码,您将无法使用“include_dyn”(或其中包含“include”的任何内容)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多