模板中的下划线条件

时间:2013-01-14 19:05:44

标签: javascript jquery backbone.js underscore.js

这是我的模板:

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

我将使用此模板呈现的一些对象没有设置elementClass属性。我尝试使用_.has,以便模板只尝试打印定义elementClass的对象的属性,但我没有成功。控制台错误仅表明未设置elementClass,可能是因为条件语句无法正常工作。

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

2 个答案:

答案 0 :(得分: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属性,也可能没有typeof属性,那么您使用typeof时会遇到困难,因为<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' }));

在所有三个感兴趣的案例中都能正常工作:

{{1}}

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

答案 1 :(得分:1)

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

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