模板中的下划线条件

Underscore Conditionals in Template

本文关键字:下划线 条件      更新时间:2023-09-26

这是我的模板:

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

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

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

一般不能使用_.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' }));

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

可以查看elementClass是否为undefined。(使用_.isUndefined,我以前认为会工作,没有。)

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