Przy pisaniu kilku ostatnich stron WWW potrzebowałem dość często tworzenia elementów HTML na podstawie konkretnego źródła danych – coś co zwykle załatwia ASP:Repeater czy ASP:ListView (i jeszcze kilka innych kontrolek serwerowych). Problem polegał jednak na tym, że naprawdę nie chciałem zaprzęgać do tego wszystkiego ASP.NET, mogę większość rzeczy zrobić w JavaScript to po co mi do tego code behind?
I tak w pierwszym projekcie testowałem rozwiązanie tworzenia elementów HTML w jQuery, które tak naprawdę było… dość toporne :) I całość rozwiązania nie zachęcała do dalszej pracy z pluginem.
Drugim sposobem jaki spróbowałem to napisałem mały skrypt kopiujący element który mnie interesował i wypełniający go danymi. Problem leżał w tym iż nie zawsze wszystkie możliwe pola chciałem wypełniać i teraz cała zabawa polegała na if null then co jakoś ładnie i fajnie nie wyglądało :) na pewno byłby problem gdybym rozwiązanie chciał rozszerzyć o kolejne elementy.
W końcu natrafiłem na plugin do jQuery – jTempaltes. Jest to dość prosty plugin umożliwiający tworzenie szablonów w plain text, które potem można wykorzystać w celu stworzenia elementów HTML. Coś takiego będzie dopiero dostępne w ASP.NET 4.0 i szczerze mówiąc nie mogę się już tego doczekać – aktualnie zaś, funkcjonalność tą w Beta całkowicie omijam zresztą tak samo jak w Parallel Extension Framework, którego za każdym razem jak się zabierałem za zabawę to się okazywało, że trochę sporawe zmiany były w nim wprowadzone o czym MS łaskawie informowałem 2 tygodnie po czasie (zmiany były na tyle duże, że żaden przykład się nie kompilował, klasy/metody zostały usuwane, przenoszone lub ich znaczenie zmieniane, uczenie się na takiej podstawie jest… stratą czasu).
Zróbmy więc coś z jTemplates, na przykład coś takiego:
To czego potrzebujemy do rozpoczęcia zabawy z jTemplates, to pliki js jQuery i jTemplates. Dodajemy je na stronie tak jak każdy skrypt:
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.1.min.js"></script> <script type="text/javascript" src="http://jtemplates.tpython.com/jquery-jtemplates.js"></script>
Byśmy mogli cokolwiek wyrenderować to potrzebujemy danych, dla naszego przykładu wykorzystamy następujący json object, który umieścimy między tagami <script> na stronie:
var myLinks = {
title: 'Lista linków',
links: [
{ title: 'Maciej Aniserowicz', url: 'http://www.maciejaniserowicz.com' },
{ title: 'Dotnetomaniak - najlepsze wpisy', url: 'http://dotnetomaniak.pl/' },
{ title: 'CodeGuru - portal programistów .NET', url: 'http://www.codeguru.pl/' }
]
};
Następnie gdzieś musimy umieścić nasz szablon – mimo iż jTemplates działają na zasadzie plain text to jednak nie chcemy umieszczać całego szablonu jako parametr ciągu znaków do metody renderującej dane na podstawie przekazanego szablonu. W tym celu najlepiej jest stworzyć na stronie Tag HTML: textarea i ustawić jego styl na niewidoczny:
<textarea cols="0" rows ="0" style="display:none;" id="allLinks"><!-- --></textarea>
Teraz by wyświetlić naszą listę elementów, trzeba napisać krótki markup dla naszego szablonu:
<textarea cols="0" rows ="0" style="display:none;" id="allLinks"><!--
<h3>{$T.title}</h3>
<ul>
{#foreach $T.links as link}
<li>
{$T.link.title} - <a href="{$T.link.url}">link</a>
</li>
{#/for}
</ul>
--></textarea>
I to prawie już koniec. To czego nam brakuje, to miejsca w którym nasz wygenerowany output z szablonu ma być umieszczony:
<div id="links"> </div>
Oraz funkcji ładującej dane do szablonu:
$(document).ready(function() {
// #links gdzie ma być szablon wygenerowany
// allLinks ID elementu w którym znajduje się szablon
// myLinks json object zawierający dane do wyświetlenia
$("#links").setTemplateElement("allLinks");
$("#links").processTemplate(myLinks);
});
To jest akurat bardzo prosty przykład, jednak za pomocą jTemplates można wykonać dużo bardziej zaawansowane rzeczy – zarówno zagnieżdżone szablony czy też szablony które oczekują na dane pobierane asynchronicznie. Dzięki przejrzystej dokumentacji i rozbudowanych przykładach na stronach jTemplates dość szybko można zapoznać się z funkcjonalnością i sposobami wykorzystania szablonów – osobiście gorąco polecam plugin :)
A tutaj zamieszczam cały kod przykładu:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Test</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.1.min.js"></script>
<script type="text/javascript" src="http://jtemplates.tpython.com/jquery-jtemplates.js"></script>
<script type="text/javascript">
var myLinks = {
title: 'Lista linków',
links: [
{ title: 'Maciej Aniserowicz', url: 'http://www.maciejaniserowicz.com' },
{ title: 'Dotnetomaniak - najlepsze wpisy', url: 'http://dotnetomaniak.pl/' },
{ title: 'CodeGuru - portal programistów .NET', url: 'http://www.codeguru.pl/' }
]
};
$(document).ready(function() {
// #links gdzie ma być szablon wygenerowany
// allLinks ID elementu w którym znajduje się szablon
// myLinks json object zawierający dane do wyświetlenia
$("#links").setTemplateElement("allLinks");
$("#links").processTemplate(myLinks);
});
</script>
</head>
<body>
<textarea cols="0" rows ="0" style="display:none;" id="allLinks"><!--
<h3>{$T.title}</h3>
<ul>
{#foreach $T.links as link}
<li>
{$T.link.title} - <a href="{$T.link.url}">link</a>
</li>
{#/for}
</ul>
--></textarea>
<div id="links">
</div>
</body>
</html>















Fajne! Zdecydowanie wygodniejsze niz reczne generowanie elementow html za pomoca jquery, co mi sie zdarzalo robic:)
Pytanie: dlaczego textarea jako ukryty kontener szablonu a nie np div?
@Procent
Gdyz domyslnie jak zrobilem na divie to mi nie dzialalo :) a potem w dokumentacji znalazlem takie cos:
Use content of HTML element ‘elementName’ (textarea) as template and assign to HTML element(s) (0.6.5+)
jQuery jQuery.fn.setTemplateElement(String elementName, [Array includes], [Object settings]);
po zamianie na textarea zadzialalo :)
Comments are closed.