Javascript 模板中的下划线条件

Javascript 模板中的下划线条件,javascript,jquery,backbone.js,underscore.js,Javascript,Jquery,Backbone.js,Underscore.js,这是我的模板: var tmpl = _.template('<<%= elementTag %> <% if (_.has(elementClass)) { %> class="<%= elementClass %>" <% } %> <%= elementExtra %>><%= template(elementContent) %></<%= elementTag %>>'); 我

这是我的模板:

var tmpl = _.template('<<%= elementTag %> <% if (_.has(elementClass)) { %> class="<%= elementClass %>" <% } %> <%= elementExtra %>><%= template(elementContent) %></<%= elementTag %>>');
我将使用此模板渲染的某些对象没有elementClass属性集。我尝试使用u0.has,以便模板仅尝试打印定义了elementClass的对象的属性,但没有成功。console错误仅表明未设置elementClass,可能是因为条件语句未能按我的预期工作

我知道这是一个简单的问题,但我似乎无法解决它-如何在这样的语句中使用条件来检测未设置特定属性的对象?

您可以检查elementClass是否未定义。使用u.isUndefined,正如我之前认为的那样,不起作用

var tmpl = _.template('<<%= elementTag %> <% if ( typeof elementClass !== "undefined" ) ) { print("class=\'elementClass\'") } %> <%= elementExtra %>><%= template(elementContent) %></<%= elementTag %>>');
您可以检查elementClass是否未定义。使用u.isUndefined,正如我之前认为的那样,不起作用

var tmpl = _.template('<<%= elementTag %> <% if ( typeof elementClass !== "undefined" ) ) { print("class=\'elementClass\'") } %> <%= elementExtra %>><%= template(elementContent) %></<%= elementTag %>>');

一般来说,你不能用这个。考虑这个模板:

<script id="t" type="text/x-underscore-template">
    <% if(!_.isUndefined(elementClass)) { %>
        <%= elementClass %>
    <% } else { %>
        No such thing.
    <% } %>
</script>
对t的调用应该会给您一个ReferenceError,因为编译的模板函数的作用域中没有elementClass。因此,如果您的对象根本没有elementClass属性,那么当您尝试获取模板时,模板函数将失败

演示:

问题是u.isUndefined函数只能检查表达式的值,它无法检查由于传递给它的模板的内部用法而导致的变量或属性是否已声明

如果对象将有一个elementClass属性,但它可能有一个未定义的值,那么您可以使用u.isDefined,如下所示:

t({ elementClass: undefined })
好的

演示:

如果对象可能有或可能没有elementClass属性,那么您将无法使用as-typeof而不尝试计算其操作数。大概是这样的:

<script id="t" type="text/x-underscore-template">
    <% if(typeof elementClass !== 'undefined') { %>
        <%= elementClass %>
    <% } else { %>
        No such thing.
    <% } %>
</script>

演示:

一般情况下,您不能用于此。考虑这个模板:

<script id="t" type="text/x-underscore-template">
    <% if(!_.isUndefined(elementClass)) { %>
        <%= elementClass %>
    <% } else { %>
        No such thing.
    <% } %>
</script>
对t的调用应该会给您一个ReferenceError,因为编译的模板函数的作用域中没有elementClass。因此,如果您的对象根本没有elementClass属性,那么当您尝试获取模板时,模板函数将失败

演示:

问题是u.isUndefined函数只能检查表达式的值,它无法检查由于传递给它的模板的内部用法而导致的变量或属性是否已声明

如果对象将有一个elementClass属性,但它可能有一个未定义的值,那么您可以使用u.isDefined,如下所示:

t({ elementClass: undefined })
好的

演示:

如果对象可能有或可能没有elementClass属性,那么您将无法使用as-typeof而不尝试计算其操作数。大概是这样的:

<script id="t" type="text/x-underscore-template">
    <% if(typeof elementClass !== 'undefined') { %>
        <%= elementClass %>
    <% } else { %>
        No such thing.
    <% } %>
</script>

演示:

您使用的任何特定原因!=vs.!=@卢卡斯:不完全是这样,typeof被定义为返回一个字符串,所以不必担心类型损坏。有什么特别的原因吗!=vs.!=@卢卡斯:不完全是这样,typeof被定义为返回一个字符串,所以不需要担心类型的混乱。是的,很好。我原来有“未定义”,但后来看到了实用方法,尽管看起来不错,但没有检查它是否工作相同。我编辑了我的答案,另一个解释得更好。是的,很好。我原来有“未定义”,但后来看到了实用方法,尽管看起来不错,但没有检查它是否工作相同。我编辑了我的答案,另一个解释得更好。