So far, I’ve posted a couple of very basic introductory posts on JsRender. In this post, I’ll get a little bit more into the meat of the templating language and show looping, conditional statements, and some other bits and pieces.
In the example, I’ve put together a supermarket receipt. It shows the items bought, their quantities and any savings from offers. Here’s the data:
var theReceipt = { items: [ { description:"800g Wholemeal Bread", quantity:2, price:1.05, offer: {qty_needed:2, price:1.90} }, { description:"Kellog's Fruit & Nut", quantity:1, price:2.69 }, { description:"2 litres Semi-skimmed Milk", quantity: 3, price:1.18, offer: {qty_needed:3, price:3.00} }, { description:"1 litre Pineapple Juice", quantity:2, price:1.10 } ], total: 9.79, saving: 0.74 };
The data contains an array of items
, each of which contains the the description
, quantity
, and price
of each item. On some items there is also details of any offer
. There is also the precomputed total
and the saving
that the customer has made.
Looping
In the previous post I showed what happens when the object you pass JsRender is an array. But what if the data contains an array as some sub-element? In that case you can use the for
tag followed by the name of the array to indicate the start of the loop (and which array to loop over). At the end of the loop repeat the tag but with a slash in front of it (rather like HTML). For the data above, it would look like this:
{{for items}} Put repeating template here {{/for}}
The tags inside the for
block will be for current element. So, for the items
above, I could use tags such as description
, quantity
, and so on.
Conditional statements
You can render parts of a template conditionally if you like. You can use the if
tag to do that. Again at the end of the block, you put the slash in front of the tag to indicate its end.
{{if some_condition}} Put template to render if true here. {{else some_other_condition}} Put template to render here if the second condition is true. {{else}} Put template to render here if previous conditions are false. {{/if}}
In the example, the test is whether the offer
object exists or not. However, it acts just like an if
conditional statement works in javascript. So if offer
evalates to false, zero, etc. then it will be regarded as false, other values are regarded as true.
{{if offer}} <tr> <td></td> <td><em>{{:offer.qty_needed}} for £{{:offer.price}}</em></td> <td><em>save:</em></td> <td><em>£{{:offer.price - (quantity * price)}}</em></td> </tr> {{/if}}
Nested object
In the looping section you can access the elements of each item being iterated over. The looping mechanism takes care of that for you, so when you are in the loop each tag is an element of the current item.
You can, as you can see in the conditional statements section above, also see that you can use the standard dot-notation to access nested elements. In this case the elements in the offer object.
Calculations
In the conditional statements section you can see some basic calculations.
{{:offer.price - (quantity * price)}}
The result of the calculation will be rendered to the page.
Rendering options
You will have noticed that templating statements are all in two braces. Where something is rendered the initial opening braces are followed by a colon. This simply outputs the results directly on to the page. This is great if the output is safe (or it is HTML), however if you want to ensure that the output is correctly encoded for a web page you can use a right-cheveron.
{{:some_html_to_be_rendered}} {{>some_text_to_be_escaped}}
The example
The example for this post can be found here. You are encouraged to view the source of the example.