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 is not defined。では、テンプレート内のifステートメントをどのように実行できますか?

回答:


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スクリプトレットと同じように見える
Dungeon Hunter

<%%>ラッパーを変更する必要があり、それでも機能するため、最後に{{}}}にこの行が表示されました。
0v3rth3d4wn 2015

78

if elseステートメントを短くしたい場合は、次の短縮形を使用できます。

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

有効な場合はIDが表示され、有効でない場合は空白が表示されます。


6
三項演算子
user457015 2014年

4
唯一の一般的な三項演算子(3オペランド)であるため、ニックネーム「3項」を取得する条件演算子
Keen

1
この回答で提案されている手法の時折の欠点は、文字列の補間を何度も繰り返していることに悩まされていることであり、テンプレートが解決することになっています。現時点では、コンパイルされた各コードタグの先頭にを_.template挿入し;ます。したがって、ステートメント間でタグを分割できますが、式の内部ではできません。と比較;if(a){b;}else{c;}してください;a?b;:c;
Keen

21

状況やスタイルによっては、直接出力できるため、タグ内でprintを使用する<% %>こともできます。お気に入り:

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

そして、いくつかの連結を含む元のスニペットの場合:

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

9

nullチェックを含める必要がある場合は、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はundefinedと同じではありませんが、それでもエラーが発生します
xorinzor

4
この場合、彼は値を変換する==を使用して値をチェックするため、問題ではありません。型変換のため、次のステートメントは真です:null == undefined-ただ言うだけで、それを保証するものではありません。
Johannes Lumpe 2013年

使用した方がいいと思います_.isEmpty()
Nick Barrett

5

上記のblackdivineに(結果をストライプ化する方法について)回答すると、すでに答えが見つかっている可能性があります(その場合、共有しないのは恥ずかしいです!)が、最も簡単な方法は、モジュラス演算子を使用することです。たとえば、forループで作業しているとします。

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

そのループ内で、インデックスの値をチェックするだけです(私の場合はi)。

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

これを行うと、残りのインデックスが2で除算されます(各インデックス行で1と0の間で切り替わります)。


3

_.isUndefinedを試すことができます

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

「日付が未定義」と「日付が未定義」の違いに注意してください。彼らはそのエラーを「「日付」という名前の変数またはグローバルプロパティが存在しない」と呼んでいたはずです。提案したコードdateは、存在しない場合でも例外をスローします。typeofこの場合は本当にが必要ですが、テンプレートデータをダックタイピングする場合は、名前付き変数を使用する方が良いでしょう。
Keenは

0

ここから:

「変数としてアクセスする代わりに、そのオブジェクトを介してデータオブジェクトのプロパティを参照することもできます。」OPの場合、これが機能することを意味します(他の可能なソリューションよりも大幅に小さい変更で)。

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

0

公式ドキュメント_.isNullから使用できるnull値を確認するには

isNull_.isNull(object)

オブジェクトの値がnullの場合、trueを返します。

_.isNull(null);
=> true
_.isNull(undefined);
=> false
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.