EJS模板语言内部逻辑以某种方式失败
我正在使用EJS partials,并且即使在浪费了数小时的debugging之后,我也遇到了一个我根本找不到的bug。
这是加载部分的代码:
<%- 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
来帮助我理解发生了什么事情,因为我只是在设置图标时才会显示图标,如果未定义, icon_popover = typeof icon_popover != 'undefined' ? icon_popover : false
其设置为false
: icon_popover = typeof icon_popover != 'undefined' ? icon_popover : false
icon_popover = typeof icon_popover != 'undefined' ? icon_popover : false
。
这里是服务器日志:
--------------------------string true --------------------------boolean false
所以基本上,无论是string
还是false
,它进入我的if
语句<% if(icon_popover){ %>
,我不知道为什么。
我做了更多的testing,如<% if(icon_popover !== false){ %>
或<% if(icon_popover === 'http://placehold.it/64x64'){ %>
相同的结果。
所以我真的不明白这一点,我认为这可能与一些EJS内部问题或caching有关,但无论如何,它真的很奇怪,日志显示的东西似乎是合乎逻辑的,但并不这样做…
这与EJS失败没有任何关系,实际上是因为一个JavaScriptdynamicparsing,总是把第一个元素,它有图标。 生成的源代码是正确的,但它的使用并不总是显示相同。
这里没有黑暗的魔法。 🙂
看起来像一个范围问题。 我不知道你的工具链的细节,但可能“参数”要么在全局名称空间中,要么在一个通用名称空间中。 检查你的文档,看看如何创build局部variables(或者也许这是不可能的)。如果你找不到其他东西,试着把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,但这是一个值得尝试的猜测。