Underscore.js şablonlarındaki ifadeler nasıl kullanılır?


239

Underscore.js şablonlama işlevini kullanıyorum ve böyle bir şablon yaptık:

<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>

Gördüğünüz gibi tüm modellerimde date parametresi bulunmayacağı için orada bir if ifadem var. Ancak bunu yapmanın yolu bana bir hata veriyor date is not defined. Peki, bir şablon içindeki ifadeler nasıl yapabilirim?

Yanıtlar:


442

Bu hile yapmalı:

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

Underscore.js şablonlarında ifve foryalnızca standart javascript sözdiziminin <% %>etiketlere sarıldığını unutmayın .


2
Harika çalışıyor ve JS anahtar / vaka ifadelerinin şablon biçimlendirmesinde de iyi çalıştığını keşfetti.
nickb

Müthiş cevap. Şablon kullanırken alternatif sınıfları nasıl kullanabileceğimi de söyleyebilir misiniz? İlk <li> a ve sonraki b sınıflarını almalı mıydı?
BlackDivine

4
@BlackDivine Geç kaldığını biliyorum, ancak alternatif stiller için şablonunuzu değiştirmemeli :nth-child(even)ve :nth-child(odd)CSS seçicileri kullanmalısınız .
prayerlayer

jsp değişkenleri oluşturmak için kullanılan java scriptlets ile aynı görünüyor
Dungeon Hunter

Bu satırı {{}}} sonunda buldum, çünkü <%%> paketini değiştirmek zorunda kaldım ve hala çalıştı.
0v3rth3d4wn

78

Else if ifadesini kısaltmayı tercih ediyorsanız, bu kısayolu kullanabilirsiniz:

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

Geçerli olduğunda kimliği göstermek ve geçerli değilse boş göstermek anlamına gelir.


6
üçlü operatör
user457015

4
Tek ortak üçlü operatör (üç işlenen) olduğu için "üçlü" takma adını alan koşullu operatör .
Keen

1
Bu cevapta önerilen tekniğin zaman zaman eksik olmasının, hangi şablonların sizin için çözmesi gerektiğini tekrar tekrar dize enterpolasyonu yaptığınıza dikkat edin. Şu an itibariyle, derlenen her kod etiketinin başına _.templatea ekler ;. Bu nedenle, ifadeler arasında kesilen ancak ifadelerin içinde kırılmayan etiketleri işleyebilir. Karşılaştırma ;if(a){b;}else{c;}için ;a?b;:c;.
Keen

21

Duruma ve ya da tarzınıza bağlı olarak, doğrudan çıktıya izin verdiği için etiketlerinizin içinde yazdırmayı da kullanmak isteyebilirsiniz <% %>. Sevmek:

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

Ve bazı snippet ile orijinal snippet için:

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

9

Boş bir kontrol eklemeniz gerekiyorsa, underscore.js'de basit bir if / else check işte.

<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 ile aynı değil, yine de bir hata üretir
xorinzor

4
Bu durumda, değeri dönüştürecek == kullanarak değeri kontrol ettiğinden, bu önemli değildir. Tür dönüşümü nedeniyle aşağıdaki ifade doğrudur: null == undefined - Bunu onaylamıyor, sadece söyleyerek.
Johannes Lumpe

Bence kullanmak daha iyi_.isEmpty()
Nick Barrett

5

Yukarıda karartmaya yanıt vermek (birinin sonuçlarını nasıl şeritlendirmekle ilgili), cevabınızı zaten bulmuş olabilirsiniz (eğer öyleyse, paylaşmadığınız için utanç!), Ancak bunu yapmanın en kolay yolu modül operatörünü kullanmaktır. örneğin, bir for döngüsü içinde çalışıyorsunuz:

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

Bu döngü içinde, dizininizin değerini kontrol edin (i, benim durumumda):

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

Bunu yaptığınızda dizinimin geri kalanının ikiye bölünmesiyle (her dizin satırı için 1 ile 0 arasında geçiş yaparak) kontrol edilir.


3

Deneyebilirsiniz _.isUndefined

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

"Tarih tanımsız" ve "tarih tanımlanmamış" arasındaki farka dikkat edin. Bu hatayı "tarih" adında değişken veya genel özellik yok "olarak adlandırmış olmalıdırlar. Önerdiğiniz kod, yoksa, yine de bir istisna atar date. typeofÖrdek yazarken şablon verilerini kullandığımızda adlandırılmış bir değişken kullanmak daha iyi olsa da, bu durumda gerçekten ihtiyacınız var .
Keen

0

Gönderen burada :

Msgstr "Veri nesnesinin özelliklerine değişken olarak erişmek yerine bu nesne üzerinden de başvurabilirsiniz." OP'nin durumu için bunun işe yarayacağı anlamına gelir (diğer olası çözümlerden önemli ölçüde daha küçük bir değişiklikle):

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

0

Null değerleri denetlemek için şunu kullanabilirsiniz _.isNullgelen resmi belgeler

isNull_.isNull(object)

Nesnenin değeri null olursa true değerini döndürür.

_.isNull(null);
=> true
_.isNull(undefined);
=> false
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.