EJS 模板语言内部逻辑以某种方式失败
EJS templating language internal logic fails somehow
我正在使用 EJS partials,我只是遇到了一个错误,即使在浪费了数小时的调试之后我也根本无法弄清楚...
这是加载部分的代码:
<%- partial(__view.partialPath('tag_popover'), {
title_popover: sentence.nickname,
content_tag: '#' + sentence.nickname,
icon_popover: 'http://placehold.it/64x64'
}) %>
<%- partial(__view.partialPath('tag_popover'), {
title_popover: 'Last revision',
content_tag: '#' + sentence.sentenceId
}) %>
这是 tag_popover
部分:
<%
/**
* Creates a standalone tag with dynamic title, content and popover for additional content.
*
* @param classes_tag CSS classes. ['tags']
* @param content_tag Tag content.
* @param icon_popover Popover icon. [none]
* @param title_popover Popover title, will be displayed.
*/
title_popover = typeof title_popover != 'undefined' ? title_popover : ''
classes_tag = typeof classes_tag != 'undefined' ? classes_tag : 'tags'
icon_popover = typeof icon_popover != 'undefined' ? icon_popover : false
content_tag = typeof content_tag != 'undefined' ? content_tag : ''
%>
<li class="<%= classes_tag %>" title="<%= title_popover %>">
<a href="#"><%= content_tag %></a>
<%- partial(__view.partialPath('popover_revision_translation'), {
icon_popover: icon_popover
}) %>
</li>
最后 popover_revision_translation
部分:
<%
/**
* Creates a standalone popover with dynamic title and body.
*
* @param icon_tag Icon. [none]
*/
icon_popover = typeof icon_popover != 'undefined' ? icon_popover : ''
%>
<% console.log('--------------------------'+typeof icon_popover)%>
<% console.log(icon_popover ? true: false)%>
<div class="custom-popover-content hide" role="seealso">
<% if(icon_popover){ %>
<img src='<%= icon_popover%>' />
<% } %>
<span>Test</span>
</div>
所以基本上,我调用了两次 tag_popover
部分,一次设置了 icon_popover
,一次没有设置 icon_popover
。但是它在第一个元素和第二个元素上显示了两次图标,我不想要任何图标。
所以,我在 popover_revision_translation
中放了一些 console.log
来帮助我理解发生了什么,因为我要求图标只有在设置时才呈现,并将其设置为 false
如果未定义:icon_popover = typeof icon_popover != 'undefined' ? icon_popover : false
.
这是服务器日志:
--------------------------string
true
--------------------------boolean
false
所以基本上无论是 string
还是 false
,它都会进入我的 if
语句 <% if(icon_popover){ %>
,我不明白为什么。
我做了更多测试,比如 <% if(icon_popover !== false){ %>
或 <% if(icon_popover === 'http://placehold.it/64x64'){ %>
,在这两种情况下我都遇到了相同的结果。
所以我真的不明白它,我认为它可能与某些 EJS 内部问题或缓存有关,但无论如何,日志显示一些看似合乎逻辑但实际并非如此的东西真的很奇怪.. .
看起来像是范围问题。我不知道您的工具链的详细信息,但可能 "parameters" 在全局名称 space 中或在通用名称 space 中。检查您的文档以了解如何创建局部变量(或者可能是不可能的。)如果您找不到其他任何东西,请尝试将 var
放在每个定义的前面,例如
var title_popover = typeof title_popover != 'undefined' ? title_popover : '';
var classes_tag = typeof classes_tag != 'undefined' ? classes_tag : 'tags';
var icon_popover = typeof icon_popover != 'undefined' ? icon_popover : false;
var content_tag = typeof content_tag != 'undefined' ? content_tag : '';
我不确定这是否可行,因为我不了解 EJS,但这是一个值得尝试的猜测。
这与 EJS 失败无关,实际上是因为 javascript 动态解析总是采用第一个元素,该元素具有图标。生成的源代码是正确的,但它的使用不正确并且总是显示相同。
这里没有黑魔法。 :)
我正在使用 EJS partials,我只是遇到了一个错误,即使在浪费了数小时的调试之后我也根本无法弄清楚...
这是加载部分的代码:
<%- partial(__view.partialPath('tag_popover'), {
title_popover: sentence.nickname,
content_tag: '#' + sentence.nickname,
icon_popover: 'http://placehold.it/64x64'
}) %>
<%- partial(__view.partialPath('tag_popover'), {
title_popover: 'Last revision',
content_tag: '#' + sentence.sentenceId
}) %>
这是 tag_popover
部分:
<%
/**
* Creates a standalone tag with dynamic title, content and popover for additional content.
*
* @param classes_tag CSS classes. ['tags']
* @param content_tag Tag content.
* @param icon_popover Popover icon. [none]
* @param title_popover Popover title, will be displayed.
*/
title_popover = typeof title_popover != 'undefined' ? title_popover : ''
classes_tag = typeof classes_tag != 'undefined' ? classes_tag : 'tags'
icon_popover = typeof icon_popover != 'undefined' ? icon_popover : false
content_tag = typeof content_tag != 'undefined' ? content_tag : ''
%>
<li class="<%= classes_tag %>" title="<%= title_popover %>">
<a href="#"><%= content_tag %></a>
<%- partial(__view.partialPath('popover_revision_translation'), {
icon_popover: icon_popover
}) %>
</li>
最后 popover_revision_translation
部分:
<%
/**
* Creates a standalone popover with dynamic title and body.
*
* @param icon_tag Icon. [none]
*/
icon_popover = typeof icon_popover != 'undefined' ? icon_popover : ''
%>
<% console.log('--------------------------'+typeof icon_popover)%>
<% console.log(icon_popover ? true: false)%>
<div class="custom-popover-content hide" role="seealso">
<% if(icon_popover){ %>
<img src='<%= icon_popover%>' />
<% } %>
<span>Test</span>
</div>
所以基本上,我调用了两次 tag_popover
部分,一次设置了 icon_popover
,一次没有设置 icon_popover
。但是它在第一个元素和第二个元素上显示了两次图标,我不想要任何图标。
所以,我在 popover_revision_translation
中放了一些 console.log
来帮助我理解发生了什么,因为我要求图标只有在设置时才呈现,并将其设置为 false
如果未定义:icon_popover = typeof icon_popover != 'undefined' ? icon_popover : false
.
这是服务器日志:
--------------------------string
true
--------------------------boolean
false
所以基本上无论是 string
还是 false
,它都会进入我的 if
语句 <% if(icon_popover){ %>
,我不明白为什么。
我做了更多测试,比如 <% if(icon_popover !== false){ %>
或 <% if(icon_popover === 'http://placehold.it/64x64'){ %>
,在这两种情况下我都遇到了相同的结果。
所以我真的不明白它,我认为它可能与某些 EJS 内部问题或缓存有关,但无论如何,日志显示一些看似合乎逻辑但实际并非如此的东西真的很奇怪.. .
看起来像是范围问题。我不知道您的工具链的详细信息,但可能 "parameters" 在全局名称 space 中或在通用名称 space 中。检查您的文档以了解如何创建局部变量(或者可能是不可能的。)如果您找不到其他任何东西,请尝试将 var
放在每个定义的前面,例如
var title_popover = typeof title_popover != 'undefined' ? title_popover : '';
var classes_tag = typeof classes_tag != 'undefined' ? classes_tag : 'tags';
var icon_popover = typeof icon_popover != 'undefined' ? icon_popover : false;
var content_tag = typeof content_tag != 'undefined' ? content_tag : '';
我不确定这是否可行,因为我不了解 EJS,但这是一个值得尝试的猜测。
这与 EJS 失败无关,实际上是因为 javascript 动态解析总是采用第一个元素,该元素具有图标。生成的源代码是正确的,但它的使用不正确并且总是显示相同。
这里没有黑魔法。 :)