如何在underscore.js模板中使用if语句?


239

我正在使用underscore.js模板功能,并且已经完成了如下模板:

<script type="text/template" id="gridItem">
    <div class="griditem <%= gridType %> <%= gridSize %>">
        <img src="<%= image %>" />
        <div class="content">
            <span class="subheading"><%= categoryName %></span>
            <% if (date) { %><span class="date"><%= date %></span><% }  %>
            <h2><%= title %></h2>
        </div>
    </div>
</script>

如您所见,我在那里有一个if语句,因为我所有的模型都没有date参数。但是,这种方式给我一个错误date is not defined。那么,如果模板中的语句该怎么办?

Answers:


442

这应该可以解决问题:

<% if (typeof(date) !== "undefined") { %>
    <span class="date"><%= date %></span>
<% } %>

请记住,在underscore.js模板中iffor它们只是包装在<% %>标记中的标准javascript语法。


2
效果很好,并且刚刚发现JS switch / case语句在模板标记中也能很好地工作。
nickb

很棒的答案。您能告诉我使用模板时如何使用交替类吗?像第一个<li>应该获得类a和下一个b?
BlackDivine

4
@BlackDivine我知道这是有点晚了,但对于交的风格,你应该使用:nth-child(even):nth-child(odd)CSS选择器,不会改变你的模板。
2013年

其外观与用于在jsp中呈现变量的java scriptlet相同
Dungeon Hunter

我最后在{{}}}的最后这一行结束了代码,因为我不得不更改<%%>包装器,但它仍然有效。
0v3rth3d4wn

78

如果您希望使用简短的if else语句,则可以使用以下缩写:

<%= typeof(id)!== 'undefined' ?  id : '' %>

这表示如果有效,则显示该ID;如果无效,则显示空白。


6
三元运算子
user457015

4
条件运算符,因为它是唯一的通用三元运算符(三操作数),所以获得昵称“三元”。
Keen 2014年

1
请注意,此答案中提出的技术的偶尔缺点是,您不得不重新进行字符串插值,而这些模板应该可以为您解决。截至目前,在每个已编译代码标记的开头_.template插入一个;。因此,它可以处理在语句之间中断但在表达式内部不中断的标签。比较;if(a){b;}else{c;};a?b;:c;
Keen 2014年

21

根据情况和您的风格,您还可能希望在标签内使用打印<% %>,因为它可以直接输出。喜欢:

<% if (typeof(id) != "undefined") {
     print(id);
}
else {
    print('new Model');
} %>

对于具有一些串联的原始代码段:

<% if (typeof(date) != "undefined") {
    print('<span class="date">' + date + '</span>');
} %>

9

如果需要包括空检查,这是underscore.js中的一个简单的if / else检查。

<div class="editor-label">
    <label>First Name : </label>
</div>
<div class="editor-field">
    <% if(FirstName == null) { %>
        <input type="text" id="txtFirstName" value="" />
    <% } else { %>
        <input type="text" id="txtFirstName" value="<%=FirstName%>" />
    <% } %>
</div>

1
null与未定义是不一样的,它仍然会产生错误
xorinzor 2013年

4
在这种情况下,这没关系,因为他使用==检查值,这将转换值。由于类型转换,以下语句为true:null == undefined-只是说不认可。
Johannes Lumpe

我认为最好使用_.isEmpty()
Nick Barrett

5

响应上面的blackdivine(关于如何去除结果的条纹),您可能已经找到了答案(如果是的话,为不共享而感到羞耻!),但是最简单的方法是使用模运算符。例如,您正在for循环中工作:

<% for(i=0, l=myLongArray.length; i<l; ++i) { %>
...
<% } %>

在该循环中,只需检查索引的值(以我为例):

<% if(i%2) { %>class="odd"<% } else { %>class="even" <% }%>

这样做将检查索引的其余部分除以2(在每个索引行之间在1和0之间切换)。


3

您可以尝试_.isUndefined

<% if (!_.isUndefined(date)) { %><span class="date"><%= date %></span><% } %>

注意“日期未定义”和“日期未定义”之间的区别。他们应该将这个错误称为“名称为'date'的变量或全局属性不存在”。如果date根本不存在,您提出的代码仍将引发异常。typeof在这种情况下,您确实确实需要使用,尽管在对模板数据进行鸭式打字时最好使用命名变量。
Keen 2014年

0

这里

“您还可以通过该对象引用数据对象的属性,而不是将其作为变量访问。” 这意味着对于OP而言,这将起作用(与其他可能的解决方案相比,变化很小):

<% if (obj.date) { %><span class="date"><%= date %></span><% }  %>

0

要检查空值,可以_.isNull官方文档中使用

isNull_.isNull(object)

如果object的值为null,则返回true。

_.isNull(null);
=> true
_.isNull(undefined);
=> false
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.