Cordova App – Generazione HTML dinamico in Javascript

Un problema frequente nelle app Cordova HTML/Javascript (ma anche in tutte le applicazioni web normali) è quello di generare dinamicamente porzioni di codice HTML, ad esempio creare risultati di ricerca o semplici liste: Screen Shot 2017-05-08 at 22.49.43 Il metodo più utilizzato è quello di embeddare il codice HTML direttamente come stringhe nel sorgente Javascript, qualcosa di questo tipo:


for(var c = 0; c < cards.length; c++)
{
   var card = cards;
   var name = card["name"];
   var id = card["id"];
   var lat = card["lat"];
   var lon = card["lon"];
   var address = card["address"];
   var tags = card["tags"];

   var html = '<li class="swipeout"><div class="swipeout-content"><a href="#" onclick="openid(' + id + ');" class="item-link item-content"><div class="item-media"><img src="' + img + '" width="44" style="border-radius: 50%;" /></div><div class="item-inner"><div class="item-title-row"><div class="item-title">' + name + '</div></div><div class="item-subtitle">';
    html += address + '<br />';

    html += '</div></div></a></div><div class="swipeout-actions-right"><a href="#" class="swipeout-delete" data-confirm="Are you sure want to delete this item?" data-confirm-title="Delete?">Elimina</a></div></li>';

    htmlAll += html;
}

La variable htmlAll contiene il codice HTML di tutta la lista, da applicare poi al DOM. Il sistema funziona ma l’HTML è a dir poco impossibile da mantenere, cambiarlo anche solo in minima parte richiede una considerevole mole di lavoro.

Template HTML

Un metodo più efficace è quello del templating HTML. E’ sufficiente creare il template HTML, ossia l’elemento da generare programmaticamente. Il template contiene tag speciali <%nomevariabile%> che saranno poi sostituiti con gli elementi testuali opportuni.  Il codice Javascript si occuperà solamente di prendere il template, riempirlo con i testi corretti, ed appenderlo al DOM. Ecco un esempio di template HTML:


<script type="text/html" id="card_template">
   <li>
   <a href="#" onclick="loadHistory(<%=id%>);" class="item-link item-content">
      <div class="item-media">
         <img src="<%=image%>" width="44" style="border-radius: 50%;" />
      </div>
      <div class="item-inner">
         <div class="item-title-row">
            <div class="item-title"><%=name%></div>
         </div>
         <div class="item-subtitle"><%=address%><br /></div>
      </div>
    </a>
    </li>
</script>

Da notare che il template va messo nel file .html e non nel codice Javascript. Il browser ignorerà questo codice in quanto racchiuso dal tag <script type=”text/html”></script>

Il codice Javascript risulterà enormemente semplificato:


for(var c = 0; c &lt; cards.length; c++)
{
    var card = cards;

    htmlAll += tmpl("card_template", card);
}

La funzione tmpl() accetta due parametri: l’id del template HTML e l’oggetto Javascript contenete i dati da scrivere nel template stesso. Il valore di ritorno è semplicemente una stringa contenente il codice HTML formattato con i campi presenti nell’oggetto Javascript. Da notare che i tag all’interno del template HTML devono coincidere con i campi dell’oggetto Javascript passato alla funzione tmpl(). Ad esempio, se l’oggetto Javascript è cosi’ formato:


var card = {
   name: "gianluca",
   phone: "3286961602"
}

il template dovrà necessariamente contenere i tag <%=name%> e <%=phone%>
La funzione tmpl() può essere scaricata a questo indirizzo

Leave a Reply

avatar
wpDiscuz