Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mustache - How to detect array is not empty?

I want to implement the following logic with Mustache:

{{#if users.length > 0}}
    <ul>
        {{#users}}
            <li>{{.}}</li>
        {{/users}}
    </ul>
{{/if}}

// eg. data = { users: ['Tom', 'Jerry'] }

Should I modify the users structure to meet the need? For example:

{{#hasUsers}}
    <ul>
        {{#users}}
            <li>{{.}}</li>
        {{/users}}
    </ul>
{{/hasUsers}}

// eg. data = { hasUsers: true, users: ['Tom', 'Jerry'] }
like image 511
Trantor Liu Avatar asked Jul 25 '12 15:07

Trantor Liu


3 Answers

Sorry, this may be too late. But I had similar requirement and found a better way to do this:

{{#users.length}}
    <ul>
        {{#users}}
            <li>{{.}}</li>
        {{/users}}
    </ul>
{{/users.length}}
{{^users.length}}
    <p>No Users</p>
{{/users.length}}

Working sample here: http://jsfiddle.net/eSvdb/

like image 85
Ambarish Chaudhari Avatar answered Oct 12 '22 12:10

Ambarish Chaudhari


Using {{#users.length}} works great if you want the inner statement to repeat for every element of the array, but if you only want a statement to only run once, you can use:

{{#users.0}}
...
{{/users.0}}
{{^users.0}}
...
{{/users.0}}
like image 40
thouliha Avatar answered Oct 12 '22 13:10

thouliha


I'm using chevron for Python. Since {{#users.length}} is implementation-dependent as described in previous answers, and doesn't work for me in Chevron, I return an object in my code which only contains the list if the list is non-empty. Presumably this technique would work for other languages too.

users = ["user1", "user2", "userN"]
user_obj = {"user_list": users} if len(users) > 0 else {}
template = """
{{#users}}
<ul>
    {{#user_list}}
    <li>{{.}}</li>
    {{/user_list}}
</ul>
{{/users}}
"""

chevron.render(template, {"users": user_obj})
like image 1
Dawngerpony Avatar answered Oct 12 '22 11:10

Dawngerpony