1

这是我的模板:

var tmpl = _.template('<<%= elementTag %> <% if (_.has(elementClass)) { %> class="<%= elementClass %>" <% } %> <%= elementExtra %>><%= template(elementContent) %></<%= elementTag %>>');

我将使用此模板渲染的一些对象没有elementClass属性集。我尝试使用_.has,以便模板仅尝试打印elementClass已定义但我没有成功的对象的属性。控制台错误仅说明elementClass未设置,可能是因为条件语句未能按我的预期工作。

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

4

2 回答 2

4

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

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

这个代码:

var t = _.template($('#t').html());
console.log(t({ }));

调用t应该给你一个 ReferenceError 因为编译的模板函数没有elementClass作用域。因此,如果您的对象根本没有elementClass属性,那么当您尝试获取模板时模板函数将失败。

演示:http: //jsfiddle.net/ambiguous/H22D2/

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

如果对象将具有elementClass属性但它可能具有未定义的值,那么您可以使用_.isDefined

t({ elementClass: undefined })

会好的。

演示:http: //jsfiddle.net/ambiguous/LUakg/

如果对象可能有也可能没有elementClass属性,那么你会被困住使用typeofastypeof不会尝试评估其操作数。像这样的东西:

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

在所有三种感兴趣的情况下都可以正常工作:

var t = _.template($('#t').html());
console.log(t({ }));
console.log(t({ elementClass: undefined }));
console.log(t({ elementClass: 'pancakes' }));

演示:http: //jsfiddle.net/ambiguous/H5xC7/

于 2013-01-14T20:02:40.177 回答
1

您可以检查是否elementClass不是undefined。(使用_.isUndefined,正如我之前认为的那样,不会。)

var tmpl = _.template('<<%= elementTag %> <% if ( typeof elementClass !== "undefined" ) ) { print("class=\'elementClass\'") } %> <%= elementExtra %>><%= template(elementContent) %></<%= elementTag %>>');
于 2013-01-14T19:24:11.573 回答