Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mustache Template with Nested Array of Objects

Could use a little help figuring out why my Mustache template isn't rendering properly. I'm very confused why the following isn't working. I'm sure it's a minor stupid mistake of mine or something...

   var tableRows = [
    {name: 'name1',
     values: ['1','2','3']},
    {name: 'name2',
     values: ['1','2','3']},
    {name: 'name3',
     values: ['1','2','3']}
    ];

var template = $('#mustache-template').html();

$('#target').append(Mustache.render(template, {rows: tableRows}));

HTML Template:

<div id="mustache-template">
    <table>
        <tbody>
              {{#rows}}
                <tr class="">
                  <td>{{name}}</td>
                  {{#values}}
                    <td>{{.}}</td>
                  {{/values}}
                </tr>
              {{/rows}}
        </tbody>
    </table>
</div>

I'm expecting a table with each array item being its own row, but instead I'm getting this:

[object Object]

Here's a jsFiddle to illustrate: http://jsfiddle.net/gF9ud/

like image 929
Muers Avatar asked Feb 09 '13 20:02

Muers


2 Answers

The problem is that the browser handles your template as an invalid table element. It's not a good idea to store your templates on a page like that, use <script type="text/template"> to wrap them:

<script id="mustache-template" type="text/template">
    <table>
      {{#rows}}
        <tr class="">
          <td>{{name}}</td>
          {{#values}}
            <td>{{.}}</td>
          {{/values}}
        </tr>
      {{/rows}}
    </table>
</script>

http://jsfiddle.net/zHkW5/

like image 128
dimusic Avatar answered Sep 23 '22 04:09

dimusic


Another solution that I found works is to comment out the mustache like so:

<div id="mustache-template">
    <table>
        <tbody>
             <!--  {{#rows}} -->
                <tr class="">
                  <td>{{name}}</td>
                  {{#values}}
                    <td>{{.}}</td>
                  {{/values}}
                </tr>
              <!-- {{/rows}} -->
        </tbody>
    </table>
</div>

For me, it rendered exactly as I had hoped. I think the browser kind of freaks seeing code between tr tags.

like image 45
ehed Avatar answered Sep 21 '22 04:09

ehed