วิธีการใช้ถ้าคำสั่งในแม่แบบ underscore.js?


239

ฉันใช้ฟังก์ชัน underscore.js templating และได้ทำเทมเพลตเช่นนี้:

<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อย่างไรก็ตามวิธีการทำเช่นนี้มันทำให้ผมมีข้อผิดพลาด ดังนั้นฉันจะทำอย่างไรถ้าข้อความภายในเทมเพลต?

คำตอบ:


442

สิ่งนี้ควรทำเคล็ดลับ:

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

โปรดจำไว้ว่าในแม่แบบ underscore.js ifและforเป็นเพียงไวยากรณ์จาวาสคริปต์มาตรฐานที่ห่อด้วย<% %>แท็ก


2
ใช้งานได้ดีและเพิ่งค้นพบว่าคำสั่ง JS switch / case ทำงานได้ดีในเทมเพลตมาร์กอัปเช่นกัน
nickb

คำตอบที่ยอดเยี่ยม คุณช่วยกรุณาบอกด้วยว่าฉันจะใช้คลาสอื่นได้อย่างไรเมื่อฉันใช้แม่แบบ เช่นเดียวกับ <li> อันดับแรกควรได้รับคลาส a และ b ต่อไปหรือไม่
BlackDivine

4
@BlackDivine ฉันรู้ว่ามันสายไปแล้ว แต่สำหรับรูปแบบการสลับคุณควรใช้:nth-child(even)และ:nth-child(odd)ตัวเลือก CSS ไม่ใช่เปลี่ยนแม่แบบของคุณ
อธิษฐานภาวนา

มันดูเหมือนจาวาสคริปต์ที่ใช้สำหรับการเรนเดอร์ตัวแปรใน jsp
Dungeon Hunter

ฉันลงเอยด้วยบรรทัดนี้ในตอนท้าย {{}}} เพราะฉันต้องเปลี่ยนเสื้อคลุม <%%> และมันก็ยังใช้ได้
0v3rth3d4wn

78

หากคุณต้องการสั้นลงถ้ามีคำสั่ง else คุณสามารถใช้ชวเลขนี้:

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

มันหมายถึงการแสดง ID ถ้าถูกต้องและว่างเปล่าถ้ามันไม่ได้


6
ผู้ประกอบการที่ประกอบไปด้วย
457015

4
ตัวดำเนินการแบบมีเงื่อนไขซึ่งได้รับฉายา "ternary" เนื่องจากเป็นตัวดำเนินการแบบไตรภาคเท่านั้น (สามตัวถูกดำเนินการ)
คม

1
โปรดทราบว่าข้อบกพร่องของเทคนิคที่เสนอในคำตอบนี้เป็นครั้งคราวคือคุณกำลังติดขัดกับการแก้ไขสตริงอีกครั้งซึ่งแม่แบบใดที่ควรจะแก้ไขให้คุณ ณ ตอนนี้_.templateแทรก a ;ตอนเริ่มต้นของแท็กรหัสที่คอมไพล์แล้ว ดังนั้นจึงสามารถจัดการแท็กที่แยกระหว่างคำสั่ง แต่ไม่อยู่ภายในนิพจน์ เปรียบเทียบไป;if(a){b;}else{c;} ;a?b;:c;
คม

21

ขึ้นอยู่กับสถานการณ์และหรือสไตล์ของคุณคุณอาจต้องการใช้การพิมพ์ภายใน<% %>แท็กของคุณเพราะจะช่วยให้การส่งออกโดยตรง ชอบ:

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

และสำหรับข้อมูลโค้ดดั้งเดิมที่มีการต่อข้อมูลบางส่วน:

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

9

นี่คือการตรวจสอบง่ายๆถ้า / อื่นใน underscore.js ถ้าคุณจำเป็นต้องมีการตรวจสอบเป็นโมฆะ

<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

ฉันคิดว่ามันดีกว่าที่จะใช้_.isEmpty()
Nick Barrett

5

การตอบสนองต่อ blackdivine ด้านบน (เกี่ยวกับวิธีสรุปผลลัพธ์) คุณอาจได้พบคำตอบของคุณแล้ว (ถ้าเป็นเช่นนั้นน่าอายที่คุณไม่แบ่งปัน!) แต่วิธีที่ง่ายที่สุดคือการใช้ตัวดำเนินการโมดูลัส ตัวอย่างเช่นคุณกำลังทำงานใน for for loop:

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

ภายในลูปนั้นเพียงแค่ตรวจสอบค่าดัชนีของคุณ (ในกรณีของฉัน):

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

การทำเช่นนี้จะตรวจสอบส่วนที่เหลือของดัชนีของฉันหารด้วยสอง (สลับระหว่าง 1 และ 0 สำหรับแต่ละแถวดัชนี)


3

คุณสามารถลอง_.isUndefined

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

ระวังความแตกต่างระหว่าง "วันที่ไม่ได้กำหนด" และ "วันที่ไม่ได้กำหนด" พวกเขาควรเรียกข้อผิดพลาดนั้นว่า "ไม่มีตัวแปรหรือคุณสมบัติส่วนกลางที่มีชื่อ 'วันที่' รหัสที่คุณเสนอจะยังคงมีข้อยกเว้นหากdateไม่มีอยู่เลย คุณจำเป็นต้องใช้typeofในกรณีนี้แม้ว่ามันจะเป็นการดีกว่าถ้าใช้ตัวแปรที่มีชื่อเมื่อเรากำลังพิมพ์ข้อมูลเทมเพลตเป็ด
คม

0

จากที่นี่ :

"คุณยังสามารถอ้างถึงคุณสมบัติของวัตถุข้อมูลผ่านวัตถุนั้นแทนที่จะเข้าถึงพวกมันเป็นตัวแปร" หมายความว่าสำหรับกรณีของ OP สิ่งนี้จะใช้ได้ (โดยมีการเปลี่ยนแปลงเล็กน้อยกว่าโซลูชันที่เป็นไปได้อื่น ๆ ):

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.