}
When developing modern HTML applications, you often write a lot of HTML fragments programmatically. You concatenate HTML tags and dynamic data, and insert the resulting UI markup into the DOM. Here is a random code example of this approach:
$.each(messages.reverse(), function(index, message) {
$('#messageList').append(
'<li><span class="list-title">' +
message.userName + '</span>' +
'<abbr class="list-timestamp" title="' +
message.datePosted + '"></abbr>' +
'<p class="list-text">' + message.messageText + '</p></li>');
}
});
The proliferation of this kind of code throughout your application comes with some downsides. The tight coupling of UI and data logic doesn’t promote separation of concerns and reuse. It makes your application harder to write and harder to maintain.
HTML templates address this issue by decoupling the UI definition (HTML markup) from the data. There are a number of HTML template solutions out there: jQuery Templates, Underscore.js, and Mustache.js to name a few. Mustache.js is a popular choice because of its powerful syntax and fast rendering.
Mustache is a “logic-less” template syntax. “Logic-less” means that it doesn’t rely on procedural statements (if, else, for, etc.): Mustache templates are entirely defined with tags. Mustache is implemented in different languages: Ruby, JavaScript, Python, PHP, Perl, Objective-C, Java, .NET, Android, C++, Go, Lua, Scala, etc. Mustache.js is the JavaScript implementation.
In this article, we take a quick tour of some of the capabilities of Mustache.js.
To start using Mustache.js, simply add a script tag to your html file pointing to mustache.js which is available here.
You can run all the examples below here.
Sample 1: Basic Template
This is a self-explanatory example. Note that:
- Instead of being defined in a variable, the data often comes from a service call (see sample 2)
- Instead of being defined in a variable, the template is often read from a file (see sample 3)
var person = {
firstName: "Christophe",
lastName: "Coenraets",
blogURL: "http://coenraets.org"
};
var template = "<h1>{{firstName}} {{lastName}}</h1>Blog: {{blogURL}}";
var html = Mustache.to_html(template, person);
$('#sampleArea').html(html);
Result:
Christophe Coenraets
Blog: http://coenraets.org
Sample 2: Basic Template using Ajax data
Same as sample 1, except that we get the data from an Ajax service call.
$.getJSON('json/data.json', function(data) {
var template = "<h1>{{firstName}} {{lastName}}</h1>Blog: {{blogURL}}";
var html = Mustache.to_html(template, data);
$('#sampleArea').html(html);
});
Result:
John Smith
Blog: http://johnsmith.com
Sample 3: Externalized Template
Same as sample 2, except that we read the template from the main HTML file.
$.getJSON('json/data2.json', function(data) {
var template = $('#personTpl').html();
var html = Mustache.to_html(template, data);
$('#sampleArea').html(html);
});
The template is defined as follows in index.html:
<script id="personTpl" type="text/template">
<h1>{{firstName}} {{lastName}}</h1>
<p>Blog URL: <a href="{{blogURL}}">{{blogURL}}</a></p>
</script>
Result:
Lisa Jones
Blog URL: http://lisajones.com
NOTE: Sample 3 represents the way templates are being used in many dynamic Web applications:
- You get data from an Ajax service
- You read the template from an external file
In the remaining of this article, we declare the data and the template in variables to keep the examples self-contained. Remember to refer to sample 3 for a traditional setup when using templates in a dynamic Web application.
Sample 4: Enumerable Section
var data = {name: "John Smith", skills: ['JavaScript', 'PHP', 'Java']};
var tpl = "{{name}} skills:<ul>{{#skills}}<li>{{.}}</li>{{/skills}}</ul>";
var html = Mustache.to_html(tpl, data);
$('#sampleArea').html(html);
Result:
- JavaScript
- PHP
- Java
Sample 5: Enumerable Section with Objects
var data = {
employees: [
{ firstName: "Christophe",
lastName: "Coenraets"},
{ firstName: "John",
lastName: "Smith"}
]};
var template = "Employees:<ul>{{#employees}}" +
"<li>{{firstName}} {{lastName}}</li>" +
"{{/employees}}</ul>";
var html = Mustache.to_html(template, data);
$('#sampleArea').html(html);
Result:
- Christophe Coenraets
- John Smith
Sample 6: Nested Objects
You can use the dot notation to access object properties.
var person = {
firstName: "Christophe",
lastName: "Coenraets",
blogURL: "http://coenraets.org",
manager : {
firstName: "John",
lastName: "Smith"
}
};
var template = "<h1>{{firstName}} {{lastName}}</h1><p>{{blogURL}}</p>" +
"Manager: {{manager.firstName}} {{manager.lastName}}";
var html = Mustache.to_html(template, person);
$('#sampleArea').html(html);
Result:
Christophe Coenraets
http://coenraets.org
Manager: John Smith
Sample 7: Dereferencing
Same as sample 6, except that we “dereference” the manager object to make it easier to access its properties (without having to use the dot notation).
var person = {
firstName: "John",
lastName: "Smith",
blogURL: "http://johnsmith.com",
manager : {
firstName: "Lisa",
lastName: "Jones"
}
};
var tpl = "<h1>{{firstName}} {{lastName}}</h1><p>{{blogURL}}</p>" +
"{{#manager}}Manager: {{firstName}} {{lastName}}{{/manager}}";
var html = Mustache.to_html(tpl, person);
$('#sampleArea').html(html);
Result:
John Smith
http://johnsmith.com
Manager: Lisa Jones
Sample 8: Function
Templates can reference functions like totalPrice in this example.
var product = {
name: "FooBar",
price: 100,
salesTax: 0.05,
totalPrice: function() {
return this.price + this.price * this.salesTax;
}
};
var template = "<p>Product Name: {{name}}</p>Price: {{totalPrice}}";
var html = Mustache.to_html(template, product);
$('#sampleArea').html(html);
Result:
Product Name: FooBar
Price: 105
Sample 9: Condition
Templates can include conditional sections. Conditional sections only render if the condition evaluates to true. A conditional section begins with {{#condition}} and ends with {{/condition}}. “condition” can be a boolean value or a function returning a boolean.
var data = {
employees: [
{ firstName: "Christophe",
lastName: "Coenraets",
fullTime: true,
phone: "617-123-4567"
},
{ firstName: "John",
lastName: "Smith",
fullTime: false,
phone: "617-987-6543"
},
{ firstName: "Lisa",
lastName: "Jones",
fullTime: true,
phone: "617-111-2323"
},
]};
var tpl = "Employees:<ul>{{#employees}}<li>{{firstName}} {{lastName}}" +
"{{#fullTime}} {{phone}}{{/fullTime}}</li>{{/employees}}</ul>";
var html = Mustache.to_html(tpl, data);
$('#sampleArea').html(html);
Result:
- Christophe Coenraets 617-123-4567
- John Smith
- Lisa Jones 617-111-2323
Sample 10: Partials
var data = {
firstName: "Christophe",
lastName: "Coenraets",
address: "1 Main street",
city: "Boston",
state: "MA",
zip: "02106"
};
var template = "<h1>{{firstName}} {{lastName}}</h1>{{>address}}";
var partials = {address: "<p>{{address}}</p>{{city}}, {{state}} {{zip}}"};
var html = Mustache.to_html(template, data, partials);
$('#sampleArea').html(html);
Result:
Christophe Coenraets
1 Main street
Boston, MA 02106
Sample 11: Partials in Enumerable Section
var data = { depts: [
{ name: "Engineering",
employees: [
{firstName: "Christophe", lastName: "Coenraets"},
{firstName: "John", lastName: "Smith"}]
},
{ name: "Sales",
employees: [
{firstName: "Paula", lastName: "Taylor"},
{firstName: "Lisa", lastName: "Jones"}]
}]
};
var tpl = "{{#depts}}<h1>{{name}}</h1>" +
"<ul>{{#employees}}{{>employee}}{{/employees}}</ul>{{/depts}}";
var partials = {employee: "<li>{{firstName}} {{lastName}}</li>"};
var html = Mustache.to_html(tpl, data, partials);
$('#sampleArea').html(html);
Result:
Engineering
- Christophe Coenraets
- John Smith
Sales
- Paula Taylor
- Lisa Jones
You can run all the examples here.
Thanks for this post. It’s an excellent cheat sheet for mustache! Much appreciated.
Pretty nice engine, was looking for something like that, thanks alot
Do you have an example of doing recursion? I have an object like this:
{ “name”: “bob”,
“friend”: [{"name": "luke"},
{"name": "steve",
"friend": [{"name": "Pat"},
{"name": "Dave"}
]}
]}
I want to see them in a list like this:
bob
luke
steve
Pat
Dave
That didn’t show up very good I want to see the output like this:
bob
—–luke
—–steve
———Pat
———Dave
Nice work! Help me a lot! thanks
Is putting templates in tags as mentioned in sample3 supported in vanilla Mustache?
I’m asking, because I was under the impression that this you would need something like ICanHaz.js for this.
It’s great if Mustache supports this out-of-the-box, since ICanHaz is signicantly slower. At least for what I have been using it for.
I keep coming back to this article and sending other to so the same when learning Mustache. The examples are source code are great, thanks.
Is there a way in Mustache to get the index of element in array?
Here’s an example how to separate the templates from the rest of the code:
{{title}}
{{content}}
var template = $(‘#template1′).html();
…
Cheers!
very usefull. i m trying to figure out whats abbout jvs
What is the difference between mustache.render and mustache.to_html? Can’t seem to find this info anywhere.
nice tutorial thanx
I am working on a project that uses brunch.io and mustache for templating. I want to add mustache partials to the main index (which serves as a ‘shell’) to load in my content. I create the mustache partials in their own .mustache file and then add the tag on the index page (ie: {{> somePartial}} ) but what I seem to be missing is how to get the partial to render… Thats what I need help with.
Thanks, good post
Hi how can we handled xml value say my json value is
var person = {
key : (value is xml )
raj
dugar
}
};
how can i get only value of tag i.e dugar from this json repsonse using template
any help will be appreciated
You explained all cases… really helped
Hey thanks for the tutorial! I have a question. How can I load and append in the body tag a Mustache template which is another folder of my website using jQuery?
$.get(url, function(data) {
var template = data;
var html = Mustache.to_html(template, person);
$(‘#sampleArea’).html(html);
});
This post was very useful. We need one more use case. I want display the html content or render the HTML content in the document.
for Example:
Here is the sample obj.
var obj = {
fName: “Kumaresan”,
lName:”",
Ph:”1234″,
Photo: “”
}
I want to display the output is given below:
1. First Output :
————– Kumaresan,
————– 1234,
2. Second Output:
First Name : “Kumaresan”
Last Name : “”
Phone : “1234″
Photo Url :
How to write a template for above output?
Thanks,
Kumaresan.
The actual value for “Photo Url” : <img src=”<Phot_url>” />
test
Quick kick starter for using Mustache and thanks for sharing such a useful tips!
Is it possible to implement paging and sorting with mustache.js??
Hey,
Very useful tutorials. I have been looking for the implementation of Mustache, and your blog explains it well. I have one problem though, I tried the ‘Sample 2: Basic Template using Ajax data’ but in my case when I view the page I am getting an error in the Firefox Error Console saying: ‘not well-formed’ pointing to the JSON file.
I have used the exact same code as shown in the sample.
Hello,
Strangely enough, the code in your tutorial is rendered wrong in both firefox and chrome.
All html-tags of the beautified code are visible and html-encoded. I don’t think that is meant to be, because they are completely unreadable.
Is this a setting in my browsers, or has something changed lately in the libraries that are used?
Cheers,
Bas
Hello! Someone in my Facebook group shared this site
with us so I came to take a look. I’m definitely enjoying the information. I’m
bookmarking and will be tweeting this to my followers! Superb blog and superb design.
You must give your marketing methods to be able to work.
In this field, the Australian Institute of Internet Marketing helps people a lot.
This really is also advantageous too simply because if someone breaks down
inside your area, but aren’t from your area, you’ve the
opportunity to beat out your competition for auto repairs on their vehicle, which
can bring in several thousand dollars a year alone.
Thank you a lot… Rally good Article…
Beautiful Tutorial!
Many thanks :)
I like this blog so significantly, saved to my bookmarks .
I’m trying to parse with mustache a json wich have this propertie
custom_fields: {
price: ["550"],
sale_type: ["rent"]
}
Like this…but no way
{{#custom_fields.sale_type}}{{.}}{{/custom_fields.sale_type}}
Help would be very appreciated!
Harum dolor pariatur. Et alias beatae iusto qui necessitatibus occaecat exercitationem nulla dicta.
Great! Thank you!
Great article Chris. Thanks for the simplified and wide range of examples that you provide.