sails.js:只有当ejs模板没有testing它们的存在时才可以看到variables

我对整个nodejs生态系统很陌生,所以善言慢语,用小词。

在过去用PHP开发一个网站时,我通常会有header.php和footer.php包含。 头文件通常包含HTML头元素,所以要定义标题和元标签的默认值,在header.php中,我通常使用如下逻辑:

if (title is not defined) { use some default title; } 

这使我能够了解我没有为某些单独页面设置标题或元描述标记的情况,并使用一些默认的全局值。

我正在尝试在sails.js中做同样的事情,而且我得到了一些奇怪的结果。 在某些看法(例如“test.ejs”)我有:

 <% var pg_title = 'test'; %> <%- include header.ejs %> 

然后在头上我有:

 <% console.log(pg_title); %> 

这工作。 (即它回声“testing”)

但是,如果header.ejs包含了是否已经定义了pg_title的任何一种testing,那么在test.ejs中设置的pg_title的值总是被忽略(它回声“未定义”)。

目前,header.ejs包含下面的代码,但我已经尝试了几个不同的东西。

 if (typeof pg_title == 'undefined') { var pg_title = __('pg_title_default'); } 

上述条件将始终评估为真。 如果我删除header.ejs中的“var”,如下面的Ravi所示,我得到一个“pg_title is not defined”的错误。

我究竟做错了什么?

你不应该像这样在模板中设置variables。 除了明显加重的范围问题,它只是混淆了你的应用程序的层次,给你一个地方,必须检查什么时候出现问题。 设置您的视图当地人在:

  • 你的res.view()调用 ,如果从控制器动作显示一个视图,或者
  • 在一个政策 ,或
  • 使用localsconfiguration密钥,如果直接将路由绑定到 config/routes.js 的视图

如果你需要为本地人设置一些默认值,那么一个政策就是一个好地方。

所以,你试图做的是不好的做法。 至于为什么它不工作的原因,这是第二个 var是这个问题,如在var pg_title = __('pg_title_default') 。 当ejs试图eval那个代码块的时候,它会导致我提到的那些加重的范围问题。