2012-01-05 38 views
27

Tôi đang sử dụng mustache.js để hiển thị mẫu trong javascript. Tôi muốn kiểm tra xem danh sách có trống hay không để ẩn thẻ <h2> trong ví dụ sau. Điều này có thể hoặc là mustache.js quá logic-ít hơn?Xử lý danh sách trống trong mustache.js

Đây là mẫu:

<h2>Persons:</h2> 
<ul> 
    {{#persons}} 
    {{name}} 
    {{/persons}} 
</ul> 

và đây là dữ liệu:

{ 
    "persons":[ 
    {"name": "max"}, 
    {"name": "tom"} 
    ] 
} 
+3

"Dữ liệu" không phải là JSON hợp lệ. –

+2

Ngoài ra, bạn có thể muốn suy nghĩ về việc chuyển từ bộ ria mép sang [tay lái] (http://handlebarsjs.com/), điều này có thể duyên dáng hơn nhiều (tôi có dám nói không?) _handle_ trường hợp như thế này. Đây không phải là lần đầu tiên ai đó yêu cầu (và bị từ chối) và kiểm tra danh sách trống trong bộ ria mép: https://github.com/defunkt/mustache/issues/47. –

+0

@ MДΓΓБДLL Tôi trừng phạt bạn vì đã không bình luận của bạn một câu trả lời (mà tôi vui vẻ sẽ bình chọn) bằng cách đăng tải nó như là một câu trả lời cho bản thân và ăn cắp các điểm nghiệp dư của bạn. – andrewrk

Trả lời

26

Để giữ cho mẫu của bạn logic ít hơn, bạn có thể làm cho việc kiểm tra này trước khi render mẫu:

// assuming you get the JSON converted into an object 
var data = { 
    persons: [ 
     {name: "max"} 
     , {name: "tom"} 
    ] 
}; 
data.hasPersons = (data.persons.length > 0); 

Sau đó mẫu của bạn sẽ trông như thế này:

<h2>Persons:</h2> 
{{#hasPersons}} 
<ul> 
    {{#persons}} 
    <li>{{name}}</li> 
    {{/persons}} 
</ul> 
{{/hasPersons}} 
+8

Nhiều như đây là câu trả lời đúng, tôi nghĩ việc sử dụng kiểu tiếp cận này là dấu hiệu của một điểm yếu thực sự trong cú pháp Mustache. Có thể OK miễn là nhà phát triển front end (template) có quyền truy cập vào mã back end (nguồn dữ liệu), nhưng nếu cả hai là riêng biệt hoặc dev kết thúc trước thì có nhiều hơn một HTML slinger so với coder, nó sẽ trở nên khá không thể thực hiện được. –

+7

@TimHolt tốt, tôi chắc chắn nhận được quan điểm của bạn. Có lợi thế mặc dù. Giả sử bạn muốn kiểm tra đơn vị phần này của ứng dụng của bạn. Với một công cụ tạo khuôn mẫu ít logic, tôi chỉ có nội dung kiểm tra dữ liệu (trước khi nó được nạp cho Mustache) và không phải thực hiện kiểm tra so sánh chuỗi trên html kết quả. Bây giờ, nếu mẫu của tôi sẽ có logic (thậm chí đơn giản như kiểm tra .length> 0) Tôi cảm thấy cần phải kiểm tra đơn vị logic đó, và do đó sẽ bị buộc phải làm so sánh chuỗi hoặc một cái gì đó giống như selenium/doh robot . Vì vậy, đó là sự cân bằng trong quan điểm của tôi. –

+3

Mục đích của việc tạo khuôn mẫu là tách Chế độ xem khỏi Mô hình và Bộ điều khiển. Giải pháp này về cơ bản là di chuyển Xem siêu thông tin vào Bộ điều khiển. Thực tế là Mustache khiến bạn làm những điều này đánh bại mục đích của chính nó. Các mẫu không nên logic (một câu lệnh if cũng là logic nên nó không phải là không logic), nhưng các khuôn mẫu phải chứa logic xem và không có logic ứng dụng. –

6

Sử dụng handlebars để thay thế. Đó là một superset của Mustache cung cấp cho bạn thêm chút năng lượng mà bạn cần. Cộng đồng ria mép đã yêu cầu tính năng này nhưng người bảo trì refuses to put it in.

34

Sau khi đấu tranh cho một nửa ngày với vấn đề này, cuối cùng tôi đã tìm được một giải pháp dễ dàng!

Đừng kiểm tra danh sách, nhưng hãy kiểm tra xem mục đầu tiên của nó có trống không!

mẫu:

{{#persons.0}} 
<h2>Persons:</h2> 
<ul> 
    {{#persons}} 
    <li>{{name}}</li> 
    {{/persons}} 
</ul> 
{{/persons.0}} 
{{^persons.0}}No persons{{/persons.0}} 

dữ liệu:

{ 
    "persons":[ 
    {"name": "max"}, 
    {"name": "tom"} 
    ] 
} 

Output:

<h2>Persons:</h2> 
<ul> 
    <li>max</li> 
    <li>tom</li> 
</ul> 

dữ liệu:

{ 
    "persons": [] 
} 

Đầu ra:

"No Persons" 
+0

Câu trả lời này phải được chấp nhận! Đó là giải pháp chung, chỉ dành cho bộ ria mép không giả định javascript – Evgeny

+0

Nó không có tác dụng đối với tôi. Tôi đang sử dụng Mustashe.java. Điều này thiếu một điều kiện về trống rỗng là một thỏa thuận-breaker cho tôi. Quay lại FreeMarker ... – dhalsim2

+0

Tác phẩm này. Cũng giống như để thêm, đối với danh sách chưa được đặt tên, được lặp lại bằng cách sử dụng {{#.}} Thì {{^.}} Không có người nào {{/.}} Có thể được sử dụng. – Blizwire

39

Bạn có thể sử dụng person.length. Nếu đó là giá trị trung thực (nghĩa là lớn hơn 0) thì khối sẽ được hiển thị.

{{#persons.length}} 
<h2>Persons:</h2> 
<ul> 
    {{#persons}} 
    <li>{{name}}</li> 
    {{/persons}} 
</ul> 
{{/persons.length}} 
+5

điều này không hoạt động nếu bạn đang kết xuất phía máy chủ (bên ngoài javascript) – iwein

+2

@iwein: câu hỏi * đã được gắn thẻ 'javascript' sau khi tất cả và cũng hoạt động trong nút, quá :) @Qazzian: +1, sạch cách tránh ria mép ria mép! –

+2

@ o.v. Tôi đã trả lời câu trả lời này, đừng lo lắng. Tuy nhiên, thông tin bổ sung trong nhận xét sẽ hữu ích cho tôi. – iwein

4

Trong javascript, bạn có thể kiểm tra với {{#names.length}}{{/names.length}} hoặc với {{#names.0}}

Nếu bạn đang ở bên ngoài javascript (ví dụ trong pystache hoặc Scalate), bạn đang trên may mắn. Giải pháp duy nhất sau đó là giới thiệu một boolean riêng biệt, hoặc lồng mảng của bạn vào một đối tượng mà bạn tránh hoàn toàn nếu bạn có một mảng trống, như maxbeatty được đề xuất.

Các vấn đề liên quan