Làm cách nào để sử dụng các câu lệnh trong các mẫu underscore.js?


239

Tôi đang sử dụng chức năng tạo khuôn mẫu underscore.js và đã thực hiện một mẫu như thế này:

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

Như bạn có thể thấy tôi có một câu lệnh if trong đó bởi vì tất cả các mô hình của tôi sẽ không có tham số ngày. Tuy nhiên cách làm này mang lại cho tôi một lỗi date is not defined. Vì vậy, làm thế nào tôi có thể làm nếu các câu lệnh trong một mẫu?

Câu trả lời:


442

Cái này cần phải dùng mẹo:

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

Hãy nhớ rằng trong các mẫu underscore.js ifforchỉ là cú pháp javascript tiêu chuẩn được gói trong <% %>các thẻ.


2
Hoạt động rất tốt và chỉ cần phát hiện ra rằng các câu lệnh chuyển đổi / trường hợp JS cũng hoạt động độc đáo trong đánh dấu mẫu.
nickb

Câu trả lời tuyệt vời. Bạn cũng có thể vui lòng cho biết làm thế nào tôi có thể sử dụng các lớp xen kẽ khi tôi đang sử dụng các mẫu không? Giống như <li> đầu tiên nên học lớp a và b tiếp theo?
BlackDivine

4
@BlackDivine Tôi biết đó là loại muộn, nhưng đối với các kiểu xen kẽ bạn nên sử dụng :nth-child(even):nth-child(odd)bộ chọn CSS, không thay đổi mẫu của bạn.
nguyện

Nó trông giống như các tập lệnh java được sử dụng để hiển thị các biến trong jsp
Dungeon Hunter

Tôi đã kết thúc với dòng này vào cuối {{}}}, vì tôi phải thay đổi trình bao <%%> và nó vẫn hoạt động.
0v3rth3d4wn

78

Nếu bạn thích câu lệnh ngắn hơn, bạn có thể sử dụng tốc ký này:

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

Nó có nghĩa là hiển thị id nếu hợp lệ và trống nếu không.


6
nhà điều hành ternary
user456015

4
Toán tử có điều kiện , có biệt danh "ternary" vì nó là toán tử ternary chung duy nhất (ba toán hạng).
Keen

1
Lưu ý rằng một sự thiếu sót đôi khi của kỹ thuật được đề xuất trong câu trả lời này là bạn bị mắc kẹt khi thực hiện nội suy chuỗi một lần nữa, các mẫu được cho là sẽ giải quyết cho bạn. Ngay từ bây giờ, hãy _.templatechèn a ;vào đầu mỗi thẻ mã được biên dịch. Do đó, nó có thể xử lý các thẻ ngắt giữa các câu lệnh, nhưng không phải bên trong các biểu thức. So sánh ;if(a){b;}else{c;}với ;a?b;:c;.
Keen

21

Tùy thuộc vào tình huống và hoặc phong cách của bạn, bạn cũng có thể muốn sử dụng in bên trong các <% %>thẻ của mình , vì nó cho phép xuất trực tiếp. Giống:

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

Và cho đoạn trích ban đầu với một số kết nối:

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

9

Dưới đây là một kiểm tra if / other đơn giản trong underscore.js, nếu bạn cần bao gồm kiểm tra null.

<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 không giống như không xác định, nó vẫn sẽ tạo ra lỗi
xorinzor

4
Trong trường hợp này, điều đó không thành vấn đề, vì anh ta kiểm tra giá trị bằng cách sử dụng ==, sẽ chuyển đổi giá trị. Do chuyển đổi loại, câu lệnh sau là đúng: null == không xác định - Không xác nhận điều đó, chỉ nói.
Julian Lumpe

Tôi nghĩ rằng nó tốt hơn để sử dụng_.isEmpty()
Nick Barrett

5

Trả lời blackdivine ở trên (về cách sọc kết quả của một người), bạn có thể đã tìm thấy câu trả lời của mình (nếu vậy, xấu hổ vì bạn không chia sẻ!), Nhưng cách dễ nhất là sử dụng toán tử mô đun. giả sử, ví dụ, bạn đang làm việc trong một vòng lặp for:

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

Trong vòng lặp đó, chỉ cần kiểm tra giá trị của chỉ mục của bạn (i, trong trường hợp của tôi):

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

Làm điều này sẽ kiểm tra phần còn lại của chỉ mục của tôi chia cho hai (chuyển từ 1 đến 0 cho mỗi hàng chỉ mục).


3

Bạn có thể thử _.isUnd xác định

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

Coi chừng sự khác biệt giữa "ngày không xác định" và "ngày không được xác định". Họ nên gọi lỗi đó là "Không có thuộc tính biến hoặc toàn cục tồn tại với tên 'ngày'." Mã bạn đã đề xuất vẫn sẽ đưa ra một ngoại lệ nếu datehoàn toàn không tồn tại. Bạn thực sự cần điều đó typeoftrong trường hợp này, mặc dù sẽ tốt hơn nếu sử dụng biến được đặt tên khi chúng ta gõ dữ liệu mẫu.
Keen

0

Từ đây :

"Bạn cũng có thể tham khảo các thuộc tính của đối tượng dữ liệu thông qua đối tượng đó, thay vì truy cập chúng dưới dạng các biến." Có nghĩa là đối với trường hợp của OP, điều này sẽ hoạt động (với sự thay đổi nhỏ hơn đáng kể so với các giải pháp khả thi khác):

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

0

Để kiểm tra giá trị null bạn có thể sử dụng _.isNulltừ tài liệu chính thức

isNull_.isNull(object)

Trả về true nếu giá trị của đối tượng là null.

_.isNull(null);
=> true
_.isNull(undefined);
=> false
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.