EJS模板语言内部逻辑不知何故失败了

EJS templating language internal logic fails somehow

本文关键字:何故 失败 语言 内部 EJS      更新时间:2023-09-26

我正在使用EJS部分,我遇到了一个错误,即使浪费了几个小时的调试时间,我也根本无法解决。。。

以下是加载部分的代码:

<%- 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,以帮助我了解发生了什么,因为我要求图标只有在设置时才渲染,如果未定义,则将其设置为falseicon_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内部问题或缓存有关,但无论如何,日志显示的东西看起来很逻辑,但实际上并不是这样的,这真的很奇怪。。。

这与EJS失败无关,实际上是因为javascript动态解析总是采用第一个元素,该元素具有图标。生成的源代码是正确的,但它的使用并不总是一样。

这里没有黑魔法。:)

看起来像是范围问题。我不知道你的工具链的细节,但"参数"可能在全局名称空间或公共名称空间中。查看您的文档,了解如何创建局部变量(或者可能不可能。)如果您找不到其他内容,请尝试将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,但这是一个值得尝试的猜测。