Nested underscore templates.

by InviS

HTML

<script src="http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js"></script>
<script src="https://raw.github.com/documentcloud/underscore/master/underscore-min.js"></script>
<table id='cmp' border='1'>
    <tr><th>User</th><th>Languages</th></tr>
</table>

<script id='langTmpl' type='x-jquery-tmpl'>
    <tr>
        <td>{{= firstname}} ${lastname}</td>
        <td>
          {{if languages}}
            {{each(i, value) languages}}
                ${i + 1}. ${value}<br />
            {{/each}}
          {{else}}
            Native only
          {{/if}}
        </td>
    </tr>
</script>

CSS

th{font-weight: bold; padding: 4px 10px; text-align: center;}
td{padding: 3px; font-style: italic;}

JavaScript

Users = [
    {
    firstname: 'Valeriy',
    lastname: 'Vasin',
    languages: ['Russian', 'Ukrainian', 'English']},
{
    firstname: 'Nastya',
    lastname: 'Guseva',
    languages: ['Russian', 'Ukrainian', 'English', 'German']},
{
    firstname: 'Alex',
    lastname: 'Levzhinsky'}
];

var tmpl = "<% _(users).each(function(user){ %>\
                <tr>\
                    <td><%= user.firstname + ' ' + user.lastname %></td>\
                    <td>\
                        <% if (user.languages){ %>\
                          <%= Languages.html(user.languages) %>\
                        <% } else { %>\
                            Native only\
                        <% } %>\
                    </td>\
                </tr>\
            <% }); %>";

// Nesting through new object
// through usual function - doesn't work - maybe we can't use functions from templates
// but we can use existed objects
// use global scope
Languages = new function(){
    this.html = function(data){
        return _(data).map(function(element, index){ return (index+1)+". "+element+"<br />"; }).join('');
    }
};

var html = _.template(tmpl, {
    users: Users
});
$('#cmp').append(html);