320 likes | 428 Vues
In this article, Rey Bango from the jQuery team explores the advantages of using jQuery templating to separate content from program code. This technique enhances readability, maintainability, and team collaboration while significantly reducing development time. Learn how to leverage template structures to simplify JavaScript data manipulation without the headache of traditional HTML concatenation methods. With examples and practical insights, discover how jQuery templates can streamline UI design and improve the reusability of existing components.
E N D
Beyond String Concatenation Using jQuery Templating to Cleanly Display Your Data
Rey Bango • jQuery Team Member • Microsoft Client-Web Community PM • Editor of ScriptJunkie.com • Ajaxian.com Writer • Co-host of the jQuery Podcast • Co-host of JSConf Live Podcast
Not a New Invention • Server-side for years • ASP.NET • Smarty & Savant (PHP) • Cheetah & Mako (Python)
Awesome-Sauce • Separates content and program code • Flexible architecture • Shortens development time • Readability • Great for teams
<form action=“clientUpdate.php” method=“post” name=“clUpd”>
Damnit DOM! • DOM Manipulation x1000 • HTML Concatenation Soup • Readability Hell • Maintenance – Needles in eyes
HTML Soup varclRec = ""; for(var i=0; i<clientData.name.length; i++) { clRec += "<li><a href='clients/"+clientData.id[i]+"'>" + clientData.name[i] + "</a></li>"; } $("ul").append(clRec);
No Soup for You! <script id=“clientTemplate” type=“text/html”> <li><a href=‘clients/${id}’>${name}</a></li> </script> $(“#clientTemplate”).tmpl(clientData).appendTo( “ul” );
Clarity • Affect the UI via pre-built templates • Nice well-defined structure • Less convoluted and hard to understand code • Greater maintainability
Templates Good • Separates UI from data • JavaScript and HTML-based. Easy! • JavaScript templates are rendered and cached client-side • Promotes reusability of existing templates • Designers & developers can coexist <3
JS Engines • JavaScript Micro-Templating • jTemplates • PURE • mustache.js • jQuery Smarty • jQuote
jQuery Templating • 1st contribution from Microsoft • MIT/GPL – Just like jQuery • Official Plugin supported by the jQuery Project
Data Templating Engine DOM Template
A Template vartmpl = "<li>${ dataItem }</li>";
A Template <script id=“myTemplate" type="text/html"> <li>${ dataItem }</li> </script>
A Template <script id="productsTemplate" type="text/html"> <div> <imgsrc="Content/ProductImages/${Picture}" class="productImage" /> <span class="productName">${Name}</span> Price: ${formatPrice(Price)} <img data-pk="${Id}" src="Content/AddCart.png" alt="Add to Cart" class="addCart" /> </div> </script>
.tmpl() <script id=“myTemplate" type="text/html"> <li>${ dataItem }</li> </script> $("#myTemplate") .tmpl( dataObject) .appendTo("ul"); <ul></ul>
Main Methods • tmpl() • tmplItem() • template() • - Render the template • - Find the template item • - Compile/Store a template
Supported Tags • ${...} • {{each ...}}...{{/each}} • {{if ...}}...{{else ...}}...{{/if}} • {{html ...}} • {{tmpl...}} • {{wrap ...}}...{{/wrap}} • - Evaluate fields or expression • - Loop over template items • - Conditional sections • - Insert markup from data • - Composition, as template items • - Composition, plus incorporation • of wrapped HTML
Inline Expressions <script id=“myTemplate" type="text/html"> <li>${parseInt(ReleaseYear) + 100}</li> </script>
Code Blocks <script id=“myTemplate" type="text/html"> <li><a href="clients/${id}">${name} {{if (age > 30)}} is Old!{{/if}}</a></li> </script>
Nesting <script id="clientTemplate" type="text/html"> <p><a href="clients/${id}">${name} {{if (age > 30)}} is Old!{{/if}}</a></p> {{tmpl($data) "#ageTemplate"}} </script> <script id="ageTemplate" type="text/html"> <p>Current Age: ${age}</p> </script>
Custom Functions function addAge() { return this.data.age + 12; } …. <script id="ageTemplate" type="text/html"> <p>Current Age: ${addAge}</p> </script>
Looping varclientData = [ { name: "Rey Bango", age: 32, id: 1, phone: [ "954-600-1234", "954-355-5555" ] },…]; …. <ul> {{each phone}}<li>${$value}</li>{{/each}} </ul>
Make it Better! https://github.com/jquery/jquery-tmpl
Rate Me! http://speakerrate.com/reybango
Rey Bango @reybango rey@reybango.com reybango@microsoft.com http://blog.reybango.com