W tym odcinku zaawansowane możliwości biblioteki JsRender na podstawie artykułu Client Insight: Advanced JsRender Templating Features.
Pojedynczy obiekt z propercjami
Zamiast:
<div>{{:address.street1}}</div>
<div>{{:address.street2}}</div>
<div>{{:address.city}}, {{:address.state}} {{:address.postalCode}}</div>
Konstrukcja for (w tym przypadku przypomina with z niektórych języków)
{{for address}}
<div>{{:street1}}</div>
<div>{{:street2}}</div>
<div>{{:city}}, {{:state}} {{:postalCode}}</div>
{{/for}}
Zewnętrzne szablony:
- renderTemplate = function (tmplName, targetSelector, data) {
- var file = formatTemplatePath(tmplName);
- $.get(file, null, function (template) {
- var tmpl = $.templates(template);
- var htmlString = tmpl.render(data);
- if (targetSelector) {
- $(targetSelector).html(htmlString);
- }
- return htmlString;
- });
- };
Szablony można definiować w postaci samego HTML z tagami JsRender albo zawierając w tagach <script>.
Specjalne ścieżki:
- #view
- #data
- #parent
- #index
- <div>{{:#data.section}}</div>
- <div>{{:#parent.parent.parent.parent.data.name}}</div>
- <div>{{:#view.data.section}}</div>
Wyrażenia:
+, -, *, /, ||, &&, !, ?:, (), %, <=, >=, <, >, ===, !==
Wspierana jest ewaluacja, ale nie przypisanie wyrażenia.
Własne tagi, helpery i konwertery
- {{myConverter:name}}
- {{myTag name}}
- {{:~myHelper(name)}}
- {{:~myParameter}}
Własny tag - np. własna kontrolka
{{:rating}}
{{createStars averageRating max=5/}} - lepiej tworzyć przy pomocy JS i CSS
- $.views.tags({
- createStars: function (rating) {
- var ratingArray = [], defaultMax = 5;
- var max = this.props.max || defaultMax; //odwołanie do deklaratywnego property
- for (var i = 1; i <= max; i++) {
- ratingArray.push(i <= rating ?
- "rating fullStar" : "rating emptyStar");
- }
- var htmlString = "";
- if (this.tmpl) {
- // Use the content or the template passed in with the template property.
- htmlString = this. renderContent(ratingArray);
- } else {
- // Use the compiled named template.
- htmlString = $.render.compiledRatingTmpl(ratingArray);
- }
- return htmlString;
- }
Własne konwertery
<div class="text highlightText">{{priceAlert:salePrice}}</div>
<img src="{{ensureUrl:boxArt.smallUrl}}" class="rightAlign"/>
- $.views.converters({
- ensureUrl: function (value) {
- return (value ? value : "/images/icon-nocover.png");
- },
- priceAlert: function (value) {0
- return (value < 10 ? "1 Day Special!" : "Sale Price");
- }
- });
Konwertery są tutaj dedykowane dla bezparametrowej konwersji. W przypadku potrzeby przekazywania parametrów należy stosować helpery lub własne tagi.
Helpery
Dwa sposoby definiowania
- $.views.helpers({ //widoczne we wszystkich szablonach
- todaysPrices: { unitPrice: 23.40 },
- extPrice:function(unitPrice, qty){
- return unitPrice * qty;
- }
- });
Przekazanie jako opcje przy wywoływaniu metody render
- $.render.myTemplate( data, {
- todaysPrices: { unitPrice: 23.40 },
- extPrice:function(unitPrice, qty){
- return unitPrice * qty;
- }
- });
Odwoływanie się do helperów w szablonie
{{: ~extPrice(~todaysPrices.unitPrice, qty) }}
{{for ~getGuitars('acoustic')}} ... {{/for}}
Wiele parametrów
- $.views.helpers({
- concat:function concat() {
- return "".concat.apply( "", arguments );
- }
- })
Możliwość umieszczania kodu w bloku {{* }} (stosować w ostateczności, miesza warstwę prezentacji z logiką –)
- <script id="myTmpl" type="text/x-jsrender">
- <tr>
- <td>{{:name}}</td>
- <td>
- {{for languages}}
- {{:#data}}{{*
- if ( view.index === view.parent.data.length - 2 ) {
- }} and {{*
- } else if ( view.index < view.parent.data.length - 2 ) {
- }}, {{* } }}
- {{/for}}
- </td>
- </tr>
- </script>
Potrzebujemy ustawić opcję allowCode na wartość true (domyślnie jest false)
- $.templates("movieTmpl", {
- markup: "#myTmpl",
- allowCode: true
- });
- $("#movieRows").html(
- $.render.movieTmpl(my.vm.movies)
- );
Lepiej jednak logikę przenosić do helperów
Brak komentarzy:
Prześlij komentarz