 
 
 <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>upCreative &#187; backbone</title>
	<atom:link href="https://www.upcreative.net/tag/backbone/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.upcreative.net</link>
	<description>Web Design, grafica,  web application e content web marketing</description>
	<lastBuildDate>Wed, 10 Apr 2019 12:53:28 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>Come creare un app: realizzare una view di login con il localStorage</title>
		<link>https://www.upcreative.net/come-creare-un-app-realizzare-view-login-localstorage/</link>
		<comments>https://www.upcreative.net/come-creare-un-app-realizzare-view-login-localstorage/#comments</comments>
		<pubDate>Thu, 29 May 2014 09:53:26 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Risorse]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[come creare un app]]></category>
		<category><![CDATA[HTML Mobile App]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[localStorage]]></category>
		<category><![CDATA[mobile login]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=3994</guid>
		<description><![CDATA[<p>Ecco un altro tutorial in cui ti mostro come creare un app mobile in HTML5, CSS3 e Javascript con Backbone.js. Nell'esperimento visualizzeremo una view di login oppure il contenuto dell'applicazione, controllando, tramite dei dati salvati lato-client su localStorage, se l'utente ha già effettuato il login o meno.</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/come-creare-un-app-realizzare-view-login-localstorage/">Come creare un app: realizzare una view di login con il localStorage</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			In questa mini-guida divisa in due parti, ti ho mostrato <a title="Come gestire i dati di un'applicazione mobile o di una web app sfruttando il Web SQL" href="http://www.upcreative.net/come-creare-un-app-in-html-salvataggio-dati-con-database-sql-lato-client-parte-1/">come gestire i dati di un&#8217;applicazione mobile o di una web app sfruttando il Web SQL</a>, un tipo di database che permette di salvare record in locale sul dispositivo utilizzato dall&#8217;utente, tramite istruzioni SQL, linguaggio ben conosciuto dalla maggior parte dei web designers.</p>
<p>I metodi di salvataggio <em>lato-client</em> sono molto utili nel caso di applicazioni mobile sviluppate in HTML5, CSS3 e Javascript, ed è per questo che oggi voglio condividere con te un tutorial incentrato su un&#8217;altro sistema di salvataggio dati <em>lato-client</em>, il <strong>localStorage.</strong></p>
<p>L&#8217;idea di scrivere questo post nasce dalla domanda di uno dei lettori di upCreative.net (a proposito, ringrazio <a href="https://twitter.com/sixdas">sixdas</a> per lo spunto) su come poter creare l&#8217;interfaccia di un&#8217;applicazione mobile che mostri all&#8217;utente una schermata di login oppure il contenuto dell&#8217;app, a seconda se è stato effettuato o meno il login con username e password.</p>
<p>Alle <strong>fine dell&#8217;articolo</strong> potrai trovare il <strong>link per il download dei file sorgenti</strong>.</p>
<hr />
<p><em>Come creare la view di login in un #HTML5 #mobileapp con #backbonejs</em><br /><a href='https://twitter.com/share?text=Come+creare+la+view+di+login+in+un+%23HTML5+%23mobileapp+con+%23backbonejs&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/come-creare-un-app-realizzare-view-login-localstorage/' target='_blank'>Click To Tweet</a></p>
<hr />
<h2>Tutorial su come creare un app: l&#8217;obiettivo finale</h2>
<p>In altre parole, all&#8217;avvio dell&#8217;applicazione controlleremo se nel <em>localStorage</em> è stata salvata una variabile che identifica l&#8217;username dell&#8217;utente: se è presente lo rimanderemo ai contenuti dell&#8217;applicazione, altrimenti visualizzeremo la schermata attraverso la quale egli potrà inserire i propri dati, che useremo poi per impostare la variabile di controllo nel <em>localStorage</em>.</p>
<p><img class="aligncenter wp-image-4015 size-full" src="http://www.upcreative.net/wp-content/uploads/2014/05/html-mobile-app-login.png" alt="html-mobile-app-login" width="690" height="600" /></p>
<p>Come <em>view</em> interna dell&#8217;app, quella accessibile solamente una volta effettuato il login, useremo la stessa del tutorial &#8220;<a title="Semplice Mobile App con Bootstrap Ratchet e Backbone.js" href="http://www.upcreative.net/smplice-html5-mobile-app-bootstrap-ratchet-backbone-js/"><strong>Semplice Mobile App con Bootstrap Ratchet e Backbone.js</strong></a>&#8221; che ti ho mostrato in precedenza, che sarà quindi utilizzato come &#8220;base&#8221; per questo esperimento (in sostanza, quello che faremo è aggiungere la parte di login).</p>
<p>Il <em>localStorage</em>, di cui avevo parlato <a title="HTML5 Mobile App: tecniche per il salvataggio dei dati" href="http://www.yourinspirationweb.com/2014/04/02/html5-mobile-app-tecniche-per-il-salvataggio-dei-dati/">in questo articolo che ho scritto</a> per YourInspirationWeb.com, è un <strong>sistema di salvataggio dati non-relazionale</strong>, che analogamente all&#8217;<em>indexedDB</em>, si basa sul concetto di coppia chiave-valore, per cui in corrispondenza di ogni chiave possiamo salvare qualsiasi tipo di variabile javascript: una stringa, un numero, un oggetto JSON e così via.</p>
<p>Noi lo utilizzeremo semplicemente per salvare l&#8217;<em>username</em> dell&#8217;utente in corrispondenza della chiave &#8220;<i>user</i>&#8220;, in modo da poter ricontrollare quella variabile ogni volta che l&#8217;applicazione viene avviata, ovvero ogni volta che il documento della pagina <em>index.html </em>viene ricaricato.</p>
<h2>La view del login</h2>
<p>L&#8217;esperimento precedente, basato su <em><a href="http://backbonejs.org/">Backbone.js</a>, </em>era strutturato in questo modo:</p>
<p><img class="aligncenter wp-image-3494 size-full" src="http://www.upcreative.net/wp-content/uploads/2014/03/composizione-backbone-views.jpg" alt="composizione-backbone-views" width="690" height="400" /></p>
<p>Quello che dobbiamo fare è aggiungere la <em>view</em> di login, esattamente allo stesso livello DOM della <em>view</em> principale mostrata nell&#8217;immagine con il colore azzurro, ed effettuare il <em>.render() </em>di una o dell&#8217;altra, a seconda del contenuto della variabile del <em>locaStorage</em>.</p>
<p><img class="aligncenter wp-image-4016 size-full" src="http://www.upcreative.net/wp-content/uploads/2014/05/html-mobile-login-view.jpg" alt="html-mobile-login-view" width="690" height="400" /></p>
<p>Come prima cosa definiamo <strong>l&#8217;oggetto <em>Backbone.View</em></strong> all&#8217;interno del file <em>demo.js, </em>il file javascript <em>demo.js,</em> in cui sono già presenti tutte le altre <em>view</em>:</p><pre class="crayon-plain-tag">//view per il login che viene mostrata solo quando l'utente non è loggato
var LoginView = Backbone.View.extend({

    // comunichiamo a backbone che deve inserire il markup del template di questa view all'interno di un oggetto dal tag 'section'
    tagName:  "section",

    //settiamo la classe che deve avere il tag 'section'
    className: "page-wrapper login-wrapper",

    //impostaiamo l'id del template da cui generare il markup di questa view
    template: "#loginview-template",

    initialize: function() {

        //compiliamo il template in una variabile
        this.template = _.template($(this.template).html());

        this.AnimEndEventName = this.getAnimEndEventName();
    },

    //funzione che genera il markup di questa view
    render: function () {
        this.$el.html(this.template()); 
        return this;
    },

    /* Grazie a modernizr riprendo il nome dell'evento di fine animazione, che cambia a seconda del browser */

    getAnimEndEventName: function(){

        var animEndEventNames = {
            'WebkitAnimation' : 'webkitAnimationEnd',
            'OAnimation' : 'oAnimationEnd',
            'msAnimation' : 'MSAnimationEnd',
            'animation' : 'animationend'
        };

        return animEndEventNames[ Modernizr.prefixed( 'animation' ) ];
    },

    // Deleghiamo gli eventi per la ricerca sull'input di testo 
    events: {
        //evento //selettore    //funzione da eseguire
        "submit  form":    "login"
    },

    //funzione che gestosce il login del form
    login: function (e) {

        e.preventDefault();
        var _this = this,
            form = $(e.currentTarget); 
            username = $.trim(form.find("[name=username]").val()),  
            password = $.trim(form.find("[name=password]").val()),
            submitBtn = form.find("button");

        //controllo sulla lunghezza di username e password
        if(username.length==0 || password.length==0){
            alert("Username e password sono obbligatori");
            return;
        }

        //qui andrebbe il controllo username e password (magaro tramite SQLite, Web SQL o su Ajax mediante database)
        //ma per questo esperimento simuliamo la cosa con un setTimeout di 2 secondi

        submitBtn.text("Login in corso...");
        setTimeout(function(){
            submitBtn.text("Login");

            //una volta verificate le credenziali di login salvo l'utente in modo persistente sul dispositivo tramite localStorage
            localStorage.setItem("user", username);
             //richiamo la funzione che inizializza i dati degli articoli e mostra la view della lista
            showList();
            //nasondo la view di login in modo da mostrare quella degli articoli
            _this.hide();

        }, 2000);      

    },

    show: function(callback){

        var _this = this;

        //aggiungendo la classe 'opened' al contenitore di questa view 
        //(elemento 'section.login-wrapper') innesco l'animazione di entrata
        this.$el.addClass("opened");

        //se è stata passata una funzione di callback, la richiamo una volta terminato l'evento di fine animazione
        if(callback){
            _this.$el.one( this.AnimEndEventName, function(){
                callback();
            });  
        }

    },

    hide: function(callback){

        var _this = this;
        //aggiungendo la classe 'hidden' al contenitore di questa view 
        //(elemento 'section.login-wrapper') inneschiamo l'animazione di uscita
        _this.$el.addClass("hidden");        
        //al termine della'animazione, rimuoviamo l'oggetto DOM dal documento tramite il metodo backbone 'remove()', in modo da alleggerire il lavoro 
        //della memoria centrale del dispositivo, contribuendo a rendere la nostra applicazione più fluida e performante 
        _this.$el.on( this.AnimEndEventName, function(){
            _this.remove();
            //se è stata passata una funzione di callback, la richiamo una volta terminato l'evento di fine animazione
            if(callback)
                callback();

        });   
    }

});</pre><p>
Nel momento in cui si verifica l&#8217;evento <em>submit</em> del <em>form </em>di login, viene richiamato il metodo &#8220;<em>login</em>&#8220;, all&#8217;interno del quale, dopo aver verificato che username e password siano stati inseriti, simuliamo una richiesta al server con un <em>setTimeout </em> di 2 secondi, durante il quale cambiamo il testo del pulsante di login.</p>
<p>Al termine dei due secondi salviamo in corrispondenza della chiave &#8220;<em>user</em>&#8221; del <em>localStorage </em>l&#8217;username fornito dall&#8217;utente, mediante <strong>il metodo &#8220;.setItem()&#8221; </strong>e richiamiamo la funzione<strong> &#8220;<em>showList&#8221;, </em></strong>che inizializzerà e mostrerà all&#8217;utente la <em>view</em> principale, quella che contiene la lista degli articoli (<em>StartView</em>)<strong><em> </em>.</strong></p>
<p>Come la <em>view</em> principale, anche quella di login utilizza come contenitore il tag <em>&lt;section&gt; </em>con con la classe &#8220;.<em>page-wrapper</em>&#8220;; in più è stata aggiunta la classe &#8220;<em>login-wrapper</em>&#8221; in modo da poter attribuire a questa view degli stili CSS aggiuntivi.</p>
<p>Grazie ad essi potremo infatti mostrare la <em>view</em> con un&#8217;animazione fluida e performante di tipo <em>slideIn</em> dal basso verso l&#8217;alto, che sfrutta la <strong>tecnica dell&#8217;accelerazione hardware.</strong></p>
<p><em>Se vuoi approfondire il discorso delle animazioni fluide e perfomanti, e quello della tecnica dell&#8217;accelerazione hardware, forse potrebbe interessarti il seguente articolo:</em></p>
<ul>
<li><a title="Web e Mobile App fluide con hardware acceleration" href="http://www.upcreative.net/web-e-mobile-app-fluide-con-layer-e-hardware-acceleration/"><em>Web e Mobile App fluide con hardware acceleration</em></a></li>
</ul>
<hr />
<p><em>Come creare la view di login in un #HTML5 #mobileapp con #backbonejs</em><br /><a href='https://twitter.com/share?text=Come+creare+la+view+di+login+in+un+%23HTML5+%23mobileapp+con+%23backbonejs&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/come-creare-un-app-realizzare-view-login-localstorage/' target='_blank'>Click To Tweet</a></p>
<hr />
<p>Inoltre sono da sottolineare i due metodi &#8220;<em>show</em>&#8221; e &#8220;<em>hide</em>&#8220;, i quali aggiungono all&#8217;elemento contenitore della <em>view</em> (l&#8217;elemento DOM &#8220;<em>section.login-wrapper&#8221;</em>) le classi &#8220;<em>opened</em>&#8221; ed &#8220;<i>hidden</i>&#8220;, che scateno le animazioni CSS di entrata e di uscita.</p>
<p>Grazie a Modernizr, incluso nel documento all&#8217;interno del file <em>index.html (</em>nel tag<em> &lt;head&gt;)</em>, riusciamo ad &#8220;agganciare&#8221; all&#8217;evento di fine animazione (il cui nome cambia a seconda del browser utilizzato dall&#8217;utente) una funzione nel momento in cui l&#8217;animazione definita nei CSS giunge al termine (vedi <a href="http://www.yourinspirationweb.com/2014/01/24/html5-mobile-app-transizioni-e-animazioni-css3-parte-2/">questo articolo</a> per avere maggiori informazioni).</p>
<h3>Gli stili CSS</h3>
<p>Vediamo gli stili CSS3 utilizzati per definire la dinamica dell&#8217;animazione di entrata e di uscita della schermata di login:</p><pre class="crayon-plain-tag">/* codice CSS3 performante per l'animazione della view di login */

section.login-wrapper {

  /*stili per il posizionamento*/
  position: fixed;
  left: 0;
  top: 0;      
  right: 0;    
  bottom:0;  
  z-index: 30;

  visibility: hidden;

  /* migliora le prestazioni prevenendo il render della parte 'posteriore' dell'elemento */
  -webkit-backface-visibility: hidden;
  -moz-backface-visibility: hidden;
  -ms-backface-visibility: hidden;
   backface-visibility: hidden;

   /* 
   	forziamo l'utilizzo della tecnica dell'accelerazione hardware per avere aniamzioni più fluide e reattive;
   	mpostando come elemento scatenante per l'effetto la proprietà 'translate3d'
   	il processo di rendering per l'elemento sarà delegato alla GPU (memoria grafica) 
   	prima, dopo e durante l'animazione
   */
   -webkit-transform: translate3d(0,0,0);
   -moz-transform: translate3d(0,0,0);
   -ms-transform: translate3d(0,0,0);
   transform: translate3d(0,0,0);               
}    

section.login-wrapper.opened{

	/*
	nel momento in cui all'elemento 'section.article-wrapper' viene aggiunta la classe 'show-article'
	innescchiamo l'animazione di entrata specifcandola in corrispondenza dell'attributo 'animation'
	*/

    -webkit-animation: showFromBottom .25s ease both;
    -moz-animation: showFromBottom .25s ease both;
    animation: showFromBottom .25s ease both;

    visibility: visible;
}

section.login-wrapper.hidden{
    /*
      nel momento in cui all'elemento 'section.article-wrapper' viene aggiunta la classe 'hide-article'
      inneschiamo l'animazione di uscita specificandola in corrispondenza dell'attributo 'animation'
    */
    -webkit-animation: hideToBottom .25s ease both;
    -moz-animation: hideToBottom .25s ease both;
    animation: hideToBottom .25s ease both;
}

/* definizione delle animazioni di entrata e di uscita per la view dell'articolo: muoviamo sempliemente l'elemento in verticale sull'asse delle ordinate */

/*animazione di entrata*/
@-webkit-keyframes showFromBottom {
    from { -webkit-transform: translateY(100%); }
}
@-moz-keyframes showFromBottom {
    from { -moz-transform: translateY(100%); }
}
@keyframes showFromBottom {
    from { transform: translateY(100%); }
}

/*animazione di uscita*/
@-webkit-keyframes hideToBottom {
    to { -webkit-transform: translateY(100%); }
}
@-moz-keyframes hideToBottom {
    to { -moz-transform: translateY(100%); }
}
@keyframes hideToBottom {
    to { transform: translateY(100%); }
}</pre><p>
La dinamica e le caratteristiche delle animazioni sono state riprese da uno dei miei precedenti tuorial sull&#8217;argomento. Per avere maggiori informazioni visita il relativo link:</p>
<ul>
<li><a title="Come creare un HTML5 Mobile App con Backbone.js" href="http://www.upcreative.net/come-creare-una-html5-mobile-app-con-backbone-js/">Come creare un HTML5 Mobile App con Backbone.js</a></li>
</ul>
<h3>Il template</h3>
<p>Come prima cosa aggiungiamo il template della view all&#8217;interno del tag <em>&lt;body&gt;</em> file <em>index.html, </em>dove sono già presenti quelli della view principale, delle view della lista e della view dell&#8217;articolo singolo:</p><pre class="crayon-plain-tag">&lt;!-- template per la view del login  (LoginView su demo.js) --&gt;
	&lt;script type="text/template" id="loginview-template"&gt;

		&lt;header class="bar bar-nav"&gt;
			&lt;button class="btn btn-link btn-nav pull-left" onclick="window.location.href='http://www.upcreative.net/iscriviti-alla-newsletter/'"&gt;
			    Altre guide
			&lt;/button&gt;
		    &lt;h1 class="title"&gt;Ultimi Articoli&lt;/h1&gt;
		    &lt;button class="btn btn-link btn-nav pull-right" onclick="window.location.href='http://www.upCreative.net'"&gt;
			    upCreative.net
			&lt;/button&gt;
		&lt;/header&gt;
		&lt;div class="content"&gt;
			&lt;h3&gt;Effettua il login&lt;/h3&gt;
			&lt;form&gt;
			  &lt;input type="text" name="username" placeholder="Username"&gt;
			  &lt;input type="password" name="password" placeholder="Password"&gt;
			  &lt;button class="btn btn-primary btn-block"&gt;Login&lt;/button&gt;
			&lt;/form&gt;
		&lt;/div&gt;

	&lt;/script&gt;</pre><p>
Anche questa <em>view</em>, come le altre, è stata realizzata in modo tale che sfrutti gli stili di <a href="http://goratchet.com/">Ratchet 2</a>, un set di CSS pronti da utilizzare come base per la realizzazione di una mobile app.</p>
<p>Al suo interno abbiamo inserito un semplice <em>form</em> di login con 2 campi per username e password.</p>
<h2>Come creare un app: il controllo del login</h2>
<p>Nell&#8217;esperimento precedente, dove il login non era presente, ci preoccupavamo subito di inizializzare la <em>view</em> princiaple; in questo tutorial dobbiamo invece controllare il contenuto della variabile <em>localStorage</em> per la chiave &#8220;<em>user</em>&#8221; prima di decidere se mostrare all&#8217;utente la <em>view</em> di login piuttosto che quella della lista degli articoli.</p>
<hr />
<p><em>Come creare la view di login in un #HTML5 #mobileapp con #backbonejs</em><br /><a href='https://twitter.com/share?text=Come+creare+la+view+di+login+in+un+%23HTML5+%23mobileapp+con+%23backbonejs&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/come-creare-un-app-realizzare-view-login-localstorage/' target='_blank'>Click To Tweet</a></p>
<hr />
<p>Pertanto inseriamo l&#8217;inizializzazione della <em>view </em>di iniziale (<em>StartView</em>) all&#8217;interno di una funzione denominata &#8220;<em>showList</em>&#8220;, in modo da poterla richiamare inizialmente oppure dopo che l&#8217;utente ha effettuato correttamente l&#8217;operazione di login:</p><pre class="crayon-plain-tag">//per poter inizializzaere e mostrare la view della lista degli articoli in più parti dell'applicazione
//la inseriamo all'interno di una funzione globale

var showList = function(){
    //creiamo una nuova istanza per la collection degli articoli con 4 models iniziali
    var articles = new ArticleList([
        {
            title: "App su upCreative.net",
            image: "1.jpg",
            article: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
        },
        {
            title: "Secondo articolo su upCreative.net",
            image: "2.jpg",
            article: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur"
        },
        {
            title: "Articolo senza immagine 3",
            image: "3.jpg",
            article: "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        },
        {
            title: "Quarto articolo sulla  lista",
            image: "4.jpg",
            article: "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        },
        {
            title: "Quinto articolo sulla  lista",
            image: "5.jpg",
            article: "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        },
        {
            title: "Sesto articolo sulla  lista",
            image: "1.jpg",
            article: "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        },
        {
            title: "Settimo articolo sulla  lista",
            image: "2.jpg",
            article: "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        }
    ]);
    //creiamo una nuova istanza per la view iniziale 
    //associandogli la collection appena creata e popolata
    var startView = new StartView({
        collection : articles
    });
    $("body").append(startView.render().el);
};</pre><p>
Una volta fatto ciò, non dovremo far altro che controllare la variabile &#8220;<em>user</em>&#8221; all&#8217;interno del <em>localStorage</em>, nel momento in cui l&#8217;applicazione viene lanciata:</p><pre class="crayon-plain-tag">$(function(){

    //riprendo il contenuto della variabile "user" del localStorage
    var user = window.localStorage.getItem("user");

    if(user){
        //se in localStorage è presente un oggetto in corrispondenza della chiave "user", 
        //allora significa che l'utente è già loggato, quindi mostriamo direttamente la view della lista degli articoli
        showList();
    }else{
        //se l'utente non è loggato (quindi il contenuto della variabile è vuoto), allora mostriamo la view di login
        var loginView = new LoginView();
        $("body").append(loginView.render().el);
        loginView.show();
    }

});</pre><p>
<h3>Come creare un app: il pulsante di logout</h3>
<p>Una volta predisposti la <em>view</em> di login ed il controllo della sessione tramite <em>localStaorage</em>, è buona norma aggiungere un pulsante per <strong>effettuare il logout</strong>, in modo da dare la possibilità all&#8217;utente di riaccedere con un username differente.</p>
<p>Inseriamo quindi nel template della <em>view</em> <em>&#8220;StartView&#8221;</em> un footer contenente il nuovo pulsante:</p><pre class="crayon-plain-tag">&lt;!-- template per la view del contenuto iniziale  (StartView su demo.js) --&gt;
	&lt;script type="text/template" id="startview-template"&gt;

		&lt;header class="bar bar-nav"&gt;
			&lt;button class="btn btn-link btn-nav pull-left" onclick="window.location.href='http://www.upcreative.net/iscriviti-alla-newsletter/'"&gt;
			    Altre guide
			&lt;/button&gt;
		    &lt;h1 class="title"&gt;Ultimi Articoli&lt;/h1&gt;
		    &lt;button class="btn btn-link btn-nav pull-right" onclick="window.location.href='http://www.upCreative.net'"&gt;
			    upCreative.net
			&lt;/button&gt;
		&lt;/header&gt;
		&lt;div class="bar bar-standard bar-header-secondary"&gt;
		    &lt;input class="search-term" placeholder="Cerca articoli" type="text"/&gt;
		&lt;/div&gt;
		&lt;div class="content"&gt;
			&lt;div class="info"&gt;
				&lt;h4&gt;Benvenuto/a "&lt;%=username%&gt;"&lt;/h4&gt;
				&lt;p&gt;Prova ad aggiornare la pagina, il login non verrà richiesto, a meno che non venga effettuato il logout. ;) &lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;

		&lt;!-- Footer con il pulsante di logout --&gt;
		&lt;div class="bar bar-standard bar-footer"&gt;
		  &lt;button class="btn btn-primary btn-block logout"&gt;Logout&lt;/button&gt;		 
		&lt;/div&gt;

	&lt;/script&gt;</pre><p>
Il click (o tap) su di esso sarà poi gestito all&#8217;interno della <em>view </em>di Backbone:</p><pre class="crayon-plain-tag">var StartView = Backbone.View.extend({

    ...

    // Deleghiamo gli eventi per la ricerca sull'input di testo 
    events: {
        ...
        "click    .logout":      "logout"  //gestione del pulsante di logout
    },

    ...

    logout: function(){

        var _this = this;

        //azzero la variabile del lovalStorage
        window.localStorage.removeItem("user");

        //mostro di unovo la view di login, per poi rimuovere questa view
        var loginView = new LoginView();
        $("body").append(loginView.render().el);
        loginView.show(function(){
            _this.remove();
        });

    }
});</pre><p>
Come puoi vedere dal codice, il compito del metodo  &#8220;<em>logout</em>&#8221; è quello di azzerare la variabile di controllo di login e mostrare la <em>view</em> &#8220;<em>LoginView</em>&#8220;, per poi rimuovere quella corrente al termine dell&#8217;animazione di entrata (passando al metodo &#8220;<em>show</em>&#8220;, definito nella <em>view </em>di login, una funzione di <em>callback</em>).</p>
<h2>Il risultato finale</h2>
<hr />
<p><em>Come creare la view di login in un #HTML5 #mobileapp con #backbonejs</em><br /><a href='https://twitter.com/share?text=Come+creare+la+view+di+login+in+un+%23HTML5+%23mobileapp+con+%23backbonejs&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/come-creare-un-app-realizzare-view-login-localstorage/' target='_blank'>Click To Tweet</a></p>
<hr />

		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<div style="background-image: url('http://www.upcreative.net/wp-content/uploads/2014/03/iphone5.png'); background-repeat: no-repeat; margin: 0 auto; padding: 145px 0px 0px 27px; width: 375px; height: 690px;"><iframe width="320" height="550" src="http://www.upcreative.net/tutorials/28052014_HTML5-Mobile-App-login/"></iframe></div>

		</div> 
	</div> <div class="g-hr">
						<span class="g-hr-h">
							<i class="fa fa-chevron-down"></i>
						</span>
					</div><div class="wpb_button align_center"><a href="http://www.upcreative.net/tutorials/28052014_HTML5-Mobile-App-login/" target="_blank"class="g-btn type_primary"><span>Apri DEMO in una nuova finestra</span></a></div>
<div class="g-hr">
						<span class="g-hr-h">
							<i class="fa fa-chevron-down"></i>
						</span>
					</div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h2>Download dei sorgenti</h2>
<h4>Aiutami a condividere la risorsa per ottenere il <strong>download</strong>:</h4>

		</div> 
	</div> <div class="g-hr">
						<span class="g-hr-h">
							<i class="fa fa-chevron-down"></i>
						</span>
					</div><div class="g-cols color_alternate w-actionbox"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Crea la tua mobile app in HTML, CSS3 e Javascript</h3>
<p>Utilizzando questa tecnica insieme a molte altre, ho realizzato più di 10 mobile app in HTML, CSS3 e Javascript (tra cui <a title="Tint HTML mobile app" href="http://www.upcreative.net/tint-weather-app/">Tint</a> e <a title="Dieta SI o NO? HTML Mobile app" href="http://www.upcreative.net/app-dieta-si-o-no/">Dieta SI o NO?</a>).</p>
<p>Se anche tu vuoi realizzare la tua applicazione in HTML, CSS e javascript da distribuire nei vari store, forse potrebbe interessarti il mio e-book <strong><a title="HTML Mobile Accelerato - Come creare una mobile app in HTML, CSS e Javacript" href="http://www.upcreative.net/html-mobile-accelerato/">HTML Mobile Accelerato</a>.</strong>
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_single_image wpb_content_element align_center">
		<div class="wpb_wrapper">
			
			<a href="http://www.upcreative.net/html-mobile-accelerato/"><img width="563" height="418" src="http://www.upcreative.net/wp-content/uploads/2013/11/HTML-mobile-accelerato-ebook-cover1.png" class="attachment-full" alt="HTML-mobile-accelerato-ebook-cover" /></a>
		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="widget_wysija_cont shortcode_wysija"><div id="msg-form-wysija-shortcode6adb4b42cd17d-4" class="wysija-msg ajax"></div><form id="form-wysija-shortcode6adb4b42cd17d-4" method="post" action="#wysija" class="widget_wysija shortcode_wysija">
<p class="wysija-paragraph">
    
    
    	<input type="text" name="wysija[user][email]" class="wysija-input validate[required,custom[email]]" title="Inserisci la tua mail" placeholder="Inserisci la tua mail" value="" />
    
    
    
    <span class="abs-req">
        <input type="text" name="wysija[user][abs][email]" class="wysija-input validated[abs][email]" value="" />
    </span>
    
</p>
<input class="wysija-submit wysija-submit-field" type="submit" value="Tienimi aggiornato/a" />

    <input type="hidden" name="form_id" value="4" />
    <input type="hidden" name="action" value="save" />
    <input type="hidden" name="controller" value="subscribers" />
    <input type="hidden" value="1" name="wysija-page" />

    
        <input type="hidden" name="wysija[user_list][list_ids]" value="4,1" />
    
 </form></div>
		</div> 
	</div> </div></div></div></div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/come-creare-un-app-realizzare-view-login-localstorage/">Come creare un app: realizzare una view di login con il localStorage</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/come-creare-un-app-realizzare-view-login-localstorage/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Semplice HTML5 Mobile App con Bootstrap Ratchet e Backbone.js</title>
		<link>https://www.upcreative.net/smplice-html5-mobile-app-bootstrap-ratchet-backbone-js/</link>
		<comments>https://www.upcreative.net/smplice-html5-mobile-app-bootstrap-ratchet-backbone-js/#comments</comments>
		<pubDate>Fri, 28 Mar 2014 14:07:15 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Risorse]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[HTML Mobile App]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile app]]></category>
		<category><![CDATA[Ratchet]]></category>
		<category><![CDATA[twitter bootstrap]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=3486</guid>
		<description><![CDATA[<p>Ecco un altro tutorial su come realizzare un' HTML5 Mobile App in CSS3 e Javascript: in questo articolo ti mostro come usare la nuova versione di Ratchet (che ora fa parte di Twitter Bootstrap) insieme a Backbone.js per sviluppare una single page application. Il tutto nei tre stili differenti offerti da Ratchet, tra cui iOS e Android.</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/smplice-html5-mobile-app-bootstrap-ratchet-backbone-js/">Semplice HTML5 Mobile App con Bootstrap Ratchet e Backbone.js</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			Nonostante non sia d&#8217;accordo con l&#8217;idea di utilizzare un framework esterno &#8220;per intero&#8221; nello sviluppo di HTML Mobile App, sono comunque convinto che attingere CSS e stili da alcuni di essi possa notevolmente <strong>incrementare la qualità del prodotto</strong> finale e <strong>velocizzare il flusso di lavoro</strong>, evitando di reinventare ogni volta la ruota.</p>
<p>In un precedente articolo avevo parlato di <a title="8 mobile framework per la realizzazione di applicazioni mobile in HTML5, CSS3 e Javascript" href="http://www.upcreative.net/8-mobile-framework-per-applicazioni-html5-css-javascript/">8 mobile framework per la realizzazione di applicazioni mobile in HTML5, CSS3 e Javascript</a>, in cui ho inserito anche <strong>Ratchet</strong>, che offre stili CSS3 molto puliti ed un markup in linea con le moderne specifiche HTML5.</p>
<p>Dopo che lo scorso mese nel blog di Twitter Bootstrap <a title="Ratchet 2.0 e Twitter Bootstrap" href="http://blog.getbootstrap.com/2014/02/25/ratchet-2/">è stato annunciato</a> che <a href="http://goratchet.com/">Ratchet 2.0</a>  farà parte d&#8217;ora in poi dell&#8217;<a href="https://github.com/twbs">organizzazione Bootstrap</a>, ho deciso di rilasciare l&#8217;esempio di una semplice <strong>HTML5 Mobile App sviluppata con <a href="http://backbonejs.org/">Backbone.js</a></strong> usando gli stili (e solo gli stili) di questa nuova versione di <strong>Ratchet</strong>, la quale quale offre<span style="line-height: 1.5em;"> 3 ottimi skin di partenza: quello <strong>di base</strong>, quello stile <strong>iOS</strong>, e quello stile <strong>Android</strong>.</span></p>
<p>Cosa desideriamo di meglio?</p>
<p style="text-align: center;"><img class="size-full wp-image-3495 aligncenter" src="http://www.upcreative.net/wp-content/uploads/2014/03/HTML5-Mobile-App-con-Bootstrap-Ratchet2-Backbone.js.jpg" alt="HTML5-Mobile-App-con-Bootstrap-Ratchet2-Backbone.js" width="690" height="400" /></p>
<p>L&#8217;intento è quello di realizzare una view iniziale con un <em>header, </em>un <em>sub-header</em> contenente un <em>input</em> di ricerca, ed il contenitore per mostrare una lista di articoli; grazie all&#8217;<em>input</em> di ricerca l&#8217;utente può filtrare i contenuti della lista.</p>
<p>L&#8217;applicazione è quindi composta da <strong>3 backbone view</strong>:</p>
<ul>
<li>la prima rappresenta la schermata principale contenente <em>header</em> e <em>sub-header</em></li>
<li>la seconda rappresenta la view della lista</li>
<li>la terza rappresenta ogni articolo che dovrà essere inserito nella lista</li>
</ul>
<p>Come nello <a title="Come creare una HTML5 Mobile App con Backbone.js" href="http://www.upcreative.net/come-creare-una-html5-mobile-app-con-backbone-js/">scorso esperimento</a>, lavoreremo sempre con <strong>model</strong> e <strong>collection</strong> per definire rispettivamente il modello di articolo e la collezione per la lista degli articoli.</p>
<p>Ecco lo schema del funzionamento dei vari componenti che formano la nostra HTML5 Mobile App:</p>
<p style="text-align: center;"><span style="color: #ff0000;"><img class="size-full wp-image-3494 aligncenter" src="http://www.upcreative.net/wp-content/uploads/2014/03/composizione-backbone-views.jpg" alt="composizione-backbone-views" width="690" height="400" /></span></p>
<p style="text-align: left;">
<hr />
<p><em>Semplice #HTML5 #MobileApp con #Bootstrap #Ratchet e #Backbonejs</em><br /><a href='https://twitter.com/share?text=Semplice+%23HTML5+%23MobileApp+con+%23Bootstrap+%23Ratchet+e+%23Backbonejs&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/smplice-html5-mobile-app-bootstrap-ratchet-backbone-js/' target='_blank'>Click To Tweet</a></p>
<hr />
<p>Trovi le <strong>DEMO</strong> dei 3 diversi stili ed il <strong>DOWNLOAD</strong> alla fine di questo articolo!</p>
<h3>HTML5 mobile app: impostazione del documento</h3>
<p>Come prima cosa andiamo a scaricare lo <em>zip </em>di Ratchet dal sito ed includiamo nel nostro documento solo gli stili CSS ed il <em>font</em> per le icone. Per usare lo stile base dovremo includere solo il file &#8216;<em>ratchet.css</em>&#8216; o &#8216;<em>ratchet.min.css</em>&#8216;, mentre per gli stili iOS o android dovremo aggiungere anche i rispettivi file &#8216;<em>ratchet-theme-ios.css</em>&#8216; o &#8216;<em>ratchet-theme-android.css</em>&#8216;.</p>
<p>Ecco l&#8217;esempio per l&#8217;utilizzo del tema iOS:</p><pre class="crayon-plain-tag">&lt;!-- includiamo gli stili di base di  Ratchet.css  --&gt;
&lt;link href="css/ratchet/css/ratchet.css" rel="stylesheet"&gt;

&lt;!-- includiamo gli stili iOS di  Ratchet.css  --&gt;
&lt;link href="css/ratchet/css/ratchet-theme-ios.css" rel="stylesheet"&gt;</pre><p>
Poi inseriamo nel documento le varie librerie <em>javascript</em>, prima della chiusura del tag <em>&lt;/body&gt; </em>in modo da velocizzare il caricamento della pagina:</p><pre class="crayon-plain-tag">&lt;!-- Includo gli scripts in fondo alla pagina per velocizzarne il caricamento --&gt;
&lt;script src="js/jquery-1.10.2.min.js"&gt;&lt;/script&gt;
&lt;!-- Includiamo anche underscore.js libreria a cui si appoggia backbone.js --&gt;
&lt;script src="js/underscore.js"&gt;&lt;/script&gt; 
&lt;script src="js/backbone.js"&gt;&lt;/script&gt;    
&lt;!-- il file javascript del nostro esperimento--&gt;
&lt;script src="js/demo.js"&gt;&lt;/script&gt;</pre><p>
<h2>Definizione di model e collection</h2>
<p>Vediamo come definire il model e la collection deli articoli:</p><pre class="crayon-plain-tag">//definiamo il modello di un articolo
var ArticleModel = Backbone.Model.extend({

    // all'inizializzazione di ogni modello creiamo la relativa anteprima
    initialize: function(){
        var article = this.get("article");
        this.set("preview", article.substr(0, 70)+"...");
    },

    // Attributi predefiniti per il modello, che vengono usati 
    //se non passati al momento dell'inizializzazione    
    defaults: {
        id: new Date().getUTCMilliseconds(), //impostiamo un id univoco in base alla data 
        title: "Nessun titolo",
        article: "",
        image: false,
        createdat: new Date()
    } 
});

//definiamo la collection per la lista degli articoli
var ArticleList = Backbone.Collection.extend({ 
    //Impostiamo la referenza al model per questa collection.
    model: ArticleModel,

    //funzione che restituisce il numero seriale per l'id di ogni nuovo articolo
    nextId: function() {
        if (!this.length) return 1;
        return this.first().get('test') + 1; 
    },

    //la funzione per la ricerca, che restituisce solo i models degli articoli
    //che contengono il termine ricercato nel titolo (la usaeremo per la ricerca)
    search : function(term){
        if(term == "") return this;

        var pattern = new RegExp(term,"gi");
        return _(this.filter(function(data) {
            return pattern.test(data.get("title"));
        }));
    }
});</pre><p>
<h2>Le view</h2>
<p>Ecco come si presenta la view principale:</p><pre class="crayon-plain-tag">//definiamo la view principale della nostra app
var StartView = Backbone.View.extend({

    // comunichiamo a backbone che deve inserire il markup del template di questa view all'interno di un oggetto dal tag 'section'
    tagName:  "section",

    //settiamo la classe che deve avere il tag 'section'
    className: "page-wrapper",

    //impostaiamo l'id del template da cui generare il markup di questa view
    template: "#startview-template",

    initialize: function() {

        //compiliamo il template in una variabile
        this.template = _.template($(this.template).html());

        //inizializziamo la view della lista degli articoli
        this.resultsView = new ListView({collection: this.collection});
    },

    //funzione che genera il markup di questa view
    render: function () {
        this.$el.html(this.template()); //genero l'html di questa view 
        //inserisco l'html della view dei risultati ti ricerca nella div con classe '.content' presente in questa view
        this.$('.content').append(this.resultsView.render().el); 
        return this;
    },

    // Deleghiamo gli eventi per la ricerca sull'input di testo 
    events: {
        //evento //selettore    //funzione da eseguire
        "keyup .search-term":    "search",
        "keypress .search-term": "onkeypress"
    },

    //funzione che richiama il methodo 'renderList' della view della lista ad ogni keyup sull'input di ricerca
    search: function (e) {
        var term = $(e.currentTarget).val();
        //se il termine non è vuoto allora richiamo il 'renderList' passando i dati filtrati,
        //altrimenti richiamo il render per mostrare la lista intera
        if(term!="") 
            this.resultsView.renderList(this.collection.search(term));
        else
            this.resultsView.render();
    },

    onkeypress: function (e) {
        if (e.keyCode === 13) { // preveniamo il normale evento di invio con il pulsante 'Enter'
            e.preventDefault();
        }
    }
});</pre><p>
Avremmo potuto anche &#8220;unificare&#8221; entrambe le <em>view</em> (quella principale e quella del contenitore della lista) in un unica <em>view</em>, ma lasciandole separate riusciamo ad ottenere un <strong>progetto più scalabile e dinamico</strong>: potremmo per esempio inserire nell&#8217;elemento &#8216;<em>.content</em>&#8216; della view principale qualsiasi altra <em>view,</em> oltre a quella della lista. Ciò ci permetterebbe di usare la view principale per più di uno scopo.</p>
<p>Ora vediamo la view del contenitore della lista, che sarà applicata appunto all&#8217;interno dell&#8217;elemento DOM con classe &#8216;<em>.content</em>&#8216; della view principale:</p><pre class="crayon-plain-tag">//view per la lista degli articoli (viene inizializzata all'interno della view 'StartView')
var ListView = Backbone.View.extend({

    // comunichiamo a backbone che deve inserire il markup del template di questa view all'interno di un 'ul'
    tagName:'ul',

    //questa view non ha bisogno di template, perchè viene popolata con le varie view 'ListItemView'
    //relative ad ogni model presente nella collection

    //impostiamo la classe che deve avere il contenitore di questa view
    className:'table-view',

    initialize:function () {

    },

    //funzione per mostrare la lista completa all'avvio dell'ìapplicazione
    render : function(articles){
        var _this = this;   
        this.$el.empty(); 

        //per ogni elemento della collection creiamo una nuova view
        this.collection.each(function(task){
            var view = new ListItemView({ model: task });
            _this.$el.append(view.render().el);
        });
        return this;
    },

    //funzione che viene richiamata al momento della ricerca, alla quale vengono passati i model che 
    //soddisfano la ricerca
    renderList : function(articles){
        var _this = this;        
        this.$el.empty(); 

        //anche qui per ogni model creo la relativa view
        articles.each(function(task){
            var view = new ListItemView({ model: task });
            _this.$el.append(view.render().el);
        });
        return this;
    }

});</pre><p>
Questa view si preoccupa di mostrare inizialmente tutti i <em>model</em> (quindi gli articoli) presenti all&#8217;interno della <em>collection, </em>mentre tramite il metodo &#8216;<em>renderList</em>&#8216; mostra solamente la lista di articoli che viene passata come parametro. Tale metodo viene richiamato dalla <em>view</em> principale al momento in cui si verifica l&#8217;evento &#8216;<em>keyup</em>&#8216; sull&#8217;<em>input</em> di ricerca.</p>
<p>Per mostrare i risultati al suo interno, la view della lista provvede alla creazione di una nuova view &#8216;<em>ListItemView</em>&#8216; per ogni <em>model </em>degli articoli<em>,</em> sia all&#8217;interno del metodo &#8216;<em>render</em>&#8216; che del metodo &#8216;<em>renderList</em>&#8216;:</p><pre class="crayon-plain-tag">//view per ogni elemento da inserire nella lista dei risultati degli articoli (viene inizializzata all'interno della view 'ListView')
var ListItemView = Backbone.View.extend({

    //il tag da usare per il contenitore del markup
    tagName:"li",

    //la classe da associare al contenitore del markup
    className: "table-view-cell",

    //impostaiamo l'id del template da cui generare il markup di questa view
    template: "#listitemview-template",

    initialize:function () {

        //compiliamo il template in una variabile
        this.template = _.template($(this.template).html());

        //se il model associato subisce delle modifiche allora richiamiamo il render per aggiornare il markup 
        //(non usato in questa demo)
        this.model.on("change", this.render, this);
        //se il model associato viene eliminato, allora richiamiamo la funzione 'close' che ne rimuove il 
        //relativo DOM dal documento (non usato in questa demo)
        this.model.on("destroy", this.close, this);
    },

    //genriamo il markup passando al template compilato i dai del model dell'articolo in formato JSON
    render:function () {
        this.$el.html(this.template(this.model.toJSON()));
        return this;
    },

    close: function(){
        //elimina il DOM di questa view dal documento ed annulla gli eventi applicati nella funzione 'initialize'
        this.remove();
    }

});</pre><p>
<h2>I template e la generazione del markup</h2>
<p>Come al solito utilizziamo il <strong>sistema di templating</strong> di <strong><em>underscore.js</em></strong> per la generazione del markup di ogni <em>view</em>, considerando che la <em>view</em> della lista non ha bisogno di un template, perché come abbiamo visto il <em>markup</em> da inserire al suo interno è costituito dalle varie <em>view</em> degli articoli.</p>
<p>Per avere maggiori informazioni sui sistemi di Javascript templating, ottimi per progetti di tipo &#8220;<em>Single-Page-Application</em>&#8220;, ti consiglio di leggere questo mio precedente articolo:</p>
<ul>
<li><a title="I sistemi di Javascript templating e le migliori librerie" href="http://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/">I sistemi di Javascript templating e le migliori librerie</a></li>
</ul>
<p>Vediamo quindi i due template da inserire all&#8217;interno del documento:</p><pre class="crayon-plain-tag">&lt;!-- template per la view di ogni elemento all'interno della lista dei risultati di ricerca (ListItemView su demo.js) --&gt;
&lt;script type="text/template" id="listitemview-template"&gt;

	&lt;a href="#" data-id="&lt;%= id %&gt;" class="push-right"&gt;
	    &lt;span class="badge"&gt;
	    	&lt;%=createdat.getDate()%&gt; / &lt;%=createdat.getMonth()+1%&gt;
	    &lt;/span&gt;
	    &lt;%if(image){%&gt;
		&lt;img class="media-object pull-left" src="images/&lt;%=image%&gt;" /&gt;
		&lt;%}%&gt;
	    &lt;div class="media-body"&gt;
	        &lt;%= title %&gt;
	        &lt;p&gt;&lt;%= preview %&gt;&lt;/p&gt;
	    &lt;/div&gt;
	&lt;/a&gt;

&lt;/script&gt;

&lt;!-- template per la view del contenuto iniziale  (StartView su demo.js) --&gt;
&lt;script type="text/template" id="startview-template"&gt;

	&lt;header class="bar bar-nav"&gt;
		&lt;button class="btn btn-link btn-nav pull-left" onclick="window.location.href='http://www.upcreative.net/iscriviti-alla-newsletter/'"&gt;
		    Altre guide
		&lt;/button&gt;
	    &lt;h1 class="title"&gt;Ultimi Articoli&lt;/h1&gt;
	    &lt;button class="btn btn-link btn-nav pull-right" onclick="window.location.href='http://www.upCreative.net'"&gt;
		    upCreative.net
		&lt;/button&gt;
	&lt;/header&gt;
	&lt;div class="bar bar-standard bar-header-secondary"&gt;
	    &lt;input class="search-term" placeholder="Cerca articoli" type="text"/&gt;
	&lt;/div&gt;
	&lt;div class="content"&gt;&lt;/div&gt;

&lt;/script&gt;</pre><p>
<h2>Avviamo l&#8217;applicazione</h2>
<p style="text-align: center;"><img class="size-full wp-image-3497 aligncenter" src="http://www.upcreative.net/wp-content/uploads/2014/03/Avvio-HTML5-Mobile-App-Ratchdet-e-Backbonejs.jpg" alt="Avvio-HTML5-Mobile-App-Ratchdet-e-Backbonejs" width="690" height="280" /></p>
<p>Una volta impostati tutti i componenti necessari, passiamo all&#8217;avvio dell&#8217;applicazione, inizializzando una nuova <em>collection</em> per gli articoli con dei dati iniziali:</p><pre class="crayon-plain-tag">$(function(){

	//creiamo una nuova istanza per la collection degli articoli con 4 models iniziali
    var articles = new ArticleList([
        {
            title: "App su upCreative.net",
            image: "1.jpg",
            article: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
        },
        {
            title: "Secondo articolo su upCreative.net",
            image: "2.jpg",
            article: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur"
        },
        {
            title: "Articolo senza immagine 3",
            image: "3.jpg",
            article: "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        },
        {
            title: "Quarto articolo sulla  lista",
            image: "4.jpg",
            article: "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        },
        {
            title: "Quinto articolo sulla  lista",
            image: "5.jpg",
            article: "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        },
        {
            title: "Sesto articolo sulla  lista",
            image: "1.jpg",
            article: "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        },
        {
            title: "Settimo articolo sulla  lista",
            image: "2.jpg",
            article: "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        }
    ]);
    //creiamo una nuova istanza per la view iniziale 
    //associandogli la collection appena creata e popolata
    var startView = new StartView({
        collection : articles
    });
    $("body").append(startView.render().el);

});</pre><p>
<h2></h2>

		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h2>Backbone.js e Ratchet HTML5 mobile app: il risultato</h2>
<p>Vediamo il risultato live nei 3 skin differenti offerti da Ratchet:
		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Stile di base</h3>
<div style="background-image: url('http://www.upcreative.net/wp-content/uploads/2014/03/iphone5.png'); background-repeat: no-repeat; margin: 0 auto; padding: 145px 0px 0px 27px; width: 375px; height: 690px;"><iframe width="320" height="550" src="http://www.upcreative.net/tutorials/28032014HTML5-Mobile-App-Ratchet2-e-Backbonejs/"></iframe></div>

		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Stile di iOS</h3>
<div style="background-image: url('http://www.upcreative.net/wp-content/uploads/2014/03/iphone5.png'); background-repeat: no-repeat; margin: 0 auto; padding: 145px 0px 0px 27px; width: 375px; height: 690px;"><iframe width="320" height="550" src="http://www.upcreative.net/tutorials/28032014HTML5-Mobile-App-Ratchet2-e-Backbonejs/index-ios.html"></iframe></div>

		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Stile di Android</h3>
<div style="background-image: url('http://www.upcreative.net/wp-content/uploads/2014/03/iphone5.png'); background-repeat: no-repeat; margin: 0 auto; padding: 145px 0px 0px 27px; width: 375px; height: 690px;"><iframe width="320" height="550" src="http://www.upcreative.net/tutorials/28032014HTML5-Mobile-App-Ratchet2-e-Backbonejs/index-android.html"></iframe></div>

		</div> 
	</div> <div class="g-hr">
						<span class="g-hr-h">
							<i class="fa fa-star"></i>
						</span>
					</div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			Aiutami a condividere la risorsa per ottenere il <strong>download</strong>:</p>

		</div> 
	</div> <div class="g-hr">
						<span class="g-hr-h">
							<i class="fa fa-star"></i>
						</span>
					</div><div class="g-cols color_alternate w-actionbox"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Crea la tua mobile app in HTML, CSS3 e Javascript</h3>
<p>Utilizzando questa tecnica insieme a molte altre, ho realizzato più di 10 mobile app in HTML, CSS3 e Javascript (tra cui <a title="Tint HTML mobile app" href="http://www.upcreative.net/tint-weather-app/">Tint</a> e <a title="Dieta SI o NO? HTML Mobile app" href="http://www.upcreative.net/app-dieta-si-o-no/">Dieta SI o NO?</a>).</p>
<p>Se anche tu vuoi realizzare la tua applicazione in HTML, CSS e javascript da distribuire nei vari store, forse potrebbe interessarti il mio e-book <strong><a title="HTML Mobile Accelerato - Come creare una mobile app in HTML, CSS e Javacript" href="http://www.upcreative.net/html-mobile-accelerato/">HTML Mobile Accelerato</a>.</strong>
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_single_image wpb_content_element align_center">
		<div class="wpb_wrapper">
			
			<img width="563" height="418" src="http://www.upcreative.net/wp-content/uploads/2013/11/HTML-mobile-accelerato-ebook-cover1.png" class="attachment-full" alt="HTML-mobile-accelerato-ebook-cover" />
		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="widget_wysija_cont shortcode_wysija"><div id="msg-form-wysija-shortcode6adb4b4302501-4" class="wysija-msg ajax"></div><form id="form-wysija-shortcode6adb4b4302501-4" method="post" action="#wysija" class="widget_wysija shortcode_wysija">
<p class="wysija-paragraph">
    
    
    	<input type="text" name="wysija[user][email]" class="wysija-input validate[required,custom[email]]" title="Inserisci la tua mail" placeholder="Inserisci la tua mail" value="" />
    
    
    
    <span class="abs-req">
        <input type="text" name="wysija[user][abs][email]" class="wysija-input validated[abs][email]" value="" />
    </span>
    
</p>
<input class="wysija-submit wysija-submit-field" type="submit" value="Tienimi aggiornato/a" />

    <input type="hidden" name="form_id" value="4" />
    <input type="hidden" name="action" value="save" />
    <input type="hidden" name="controller" value="subscribers" />
    <input type="hidden" value="1" name="wysija-page" />

    
        <input type="hidden" name="wysija[user_list][list_ids]" value="4,1" />
    
 </form></div>
		</div> 
	</div> </div></div></div></div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/smplice-html5-mobile-app-bootstrap-ratchet-backbone-js/">Semplice HTML5 Mobile App con Bootstrap Ratchet e Backbone.js</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/smplice-html5-mobile-app-bootstrap-ratchet-backbone-js/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Come creare una HTML5 Mobile App con Backbone.js</title>
		<link>https://www.upcreative.net/come-creare-una-html5-mobile-app-con-backbone-js/</link>
		<comments>https://www.upcreative.net/come-creare-una-html5-mobile-app-con-backbone-js/#comments</comments>
		<pubDate>Sat, 15 Mar 2014 13:29:25 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Risorse]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[HTML Mobile App]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=3432</guid>
		<description><![CDATA[<p>Ecco un'altro tutorial che spiega come realizzare HTML5 Mobile App: in questa guida ti mostro come servirsi del framework javascript Backbone.js per sviluppare una semplicissima applicazione che dispone alcuni articoli in un lista e permette di visualizzare i dettagli dell'oggetto selezionato. Il tutto attraverso animazioni CSS3 fluide e performanti e sfruttando la tecnica dell'accelerazione hardware.</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/come-creare-una-html5-mobile-app-con-backbone-js/">Come creare una HTML5 Mobile App con Backbone.js</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			Nella realizzazione di <strong>applicazioni mobile in HTML5, CSS3 e Javascript</strong> o qualunque tipo di <strong>web app</strong>, il modo in cui viene organizzata la struttura del progetto gioca un ruolo fondamentale dal punto di vista del risultato finale. Fattori come <strong>fluidità</strong>, <strong>prestazioni</strong> e qualità della <em>user-experience</em>, ma anche la velocità di sviluppo, sono incredibilmente influenzati dal mondo in cui suddividiamo i vari componenti dell&#8217;<strong>interfaccia</strong>.</p>
<p>Vale la pena pertanto dedicare un&#8217;attenzione particolare a questo aspetto.</p>
<p>Quando parliamo di &#8220;struttura&#8221; di un&#8217;applicazione ci riferiamo generalmente al modo in cui vengono organizzati gli elementi che la compongono per poter interagire in modo logico tra di loro. Uno dei pattern (o logiche di organizzazione) più comuni per gestire questi tipi di elementi è il <strong>pattern MVC</strong>, che basa la sua logica su elementi come <strong>viste</strong> (<em>view</em>), <strong>modelli</strong> (<em>model</em>) e <strong>collezioni di modelli</strong> (<em>collection</em>).</p>
<p><em>Per approfondire il discorso del pattern MVC e dei framework di cui ci possiamo servire per implementarli al meglio nei nostri progetti, ti consiglio di leggere questo mio articolo :</em></p>
<ul>
<li><em><a title="Creare applicazioni web: il pattern MVC ed i principali framework Javascript" href="http://www.upcreative.net/creare-applicazioni-web-il-pattern-mvc-ed-i-principali-mvc-javascript-frameworks/http://www.upcreative.net/creare-applicazioni-web-il-pattern-mvc-ed-i-principali-mvc-javascript-frameworks/">Creare applicazioni web: il pattern MVC ed i principali framework Javascript</a></em></li>
</ul>
<p>Ho realizzato oltre 10 applicazioni mobile per i miei clienti, tra cui due progetti personali (<a title="Tint Weather App e Dieta Si o NO - HTML5 Mobile App realizzate in HTML, CSS e Javascript" href="http://www.upcreative.net/html5-mobile-apps/">Tint Weather App e Dieta SI o NO?</a>) e gran parte di essi sono stati sviluppati con il pattern MVC grazie al Framework <strong><a title="Backbone.js - Javascript MVC Framework" href="http://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/">Backbone.js</a> </strong>abbinato al <strong>sistema di templating</strong> di <a href="http://underscorejs.org">Underscore.js</a>, che rendono molto più semplice lavorare con la logica MVC.</p>
<p><em>Il sistema di templating è una libreria utile per la generazione di markup HTML via client (quindi tramite javascript) combinando dei dati (generalmente in formato JSON) con un template precedentemente compilato. Per avere maggiori informazioni sui sistemi di templating ti consiglio di leggere questo articolo:</em></p>
<ul>
<li><span style="text-decoration: underline;"><em><a title="Web Application: i sistemi di templating e le migliori librerie" href="http://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/">Web Application: i sistemi di templating e le migliori librerie</a></em></span></li>
</ul>
<p>In questo articolo ti voglio mostrare come poter realizzare una semplicissima HTML5 Mobile App di base, con Bakcbone.js e delle animazioni CSS3 fluide e performanti, che sfruttano la tecnica dell&#8217;<a title="Web e Mobile app fluide con layer e hardware acceleration" href="http://www.upcreative.net/web-e-mobile-app-fluide-con-layer-e-hardware-acceleration/">accelerazione hardware</a>.</p>
<hr />
<p><em>Come creare una #HTML5 #MobileApp con #Backbonejs ed il pattern #MVC</em><br /><a href='https://twitter.com/share?text=Come+creare+una+%23HTML5+%23MobileApp+con+%23Backbonejs+ed+il+pattern+%23MVC&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/come-creare-una-html5-mobile-app-con-backbone-js/' target='_blank'>Click To Tweet</a></p>
<hr />
<h2>HTML5 Mobile App: l&#8217;obiettivo finale</h2>
<p>L&#8217;obiettivo di questo esperimento è quello di capire il meccanismo di <em>views</em>, <em>models</em> e <em>collection</em> realizzando una semplicissima mobile app che mostra una serie di articoli (o news) su una lista, permetta di aggiungere nuovi articoli programmaticamente, e visualizzare il dettaglio di quelli cliccati nella lista attraverso una view che a comparsa che &#8220;entra in scena&#8221; grazie ad <strong>animazioni CSS3 performanti</strong>.</p>
<p style="text-align: center;"><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2014/03/HTML5-Mobile-App-Backbonejs.jpg"><img class="size-full wp-image-3438 aligncenter" alt="HTML5-Mobile-App-Backbonejs" src="http://www.upcreative.net/wp-content/uploads/2014/03/HTML5-Mobile-App-Backbonejs.jpg" width="690" height="400" /></a></p>
<blockquote><p>Se se un web designer e vorresti creare la tua applicazione in HTML5, CSS3 e Javascript, forse ti potrebbe interessare il mio e-book: <a title="HTML Mobile Accelerato - Guida per web designer su come realizzare HTML Mobile App in CSS3 e Javascript" href="http://www.upcreative.net/html-mobile-accelerato/">HTML Mobile Accelerato</a></p></blockquote>
<p style="text-align: center;">Trovi <strong>DEMO</strong> e <strong>DOWNLOAD</strong> in fondo all&#8217;articolo.</p>
<h2><span style="color: #000000;">Impostazione del documento</span></h2>
<p>Come prima cosa includiamo nel documento le librerie di cui abbiamo bisogno; in particolare all&#8217;interno del tag <em>&lt;body&gt; </em>inseriamo il link alla libreria <strong><a href="http://modernizr.com/">Modernizr</a></strong>, che ci servirà per gestire l&#8217;evento di fine animazione (&#8216;<em>endanimation</em>&#8216;) di entrata per la view che mostra i dettagli dell&#8217;articolo (per approfondire il discorso di come controllare le animazioni con <em>Modernizr</em>, di consiglio di leggere <a title="Modernizr e CSS3: gestire gli eventi di fine animazione e transizione con javascript" href="http://www.upcreative.net/modernizr-e-css3-gestire-eventi-animazioni-e-transizioni/">questo articolo</a>).</p><pre class="crayon-plain-tag">&lt;head&gt;
 &lt;script src="js/modernizr.custom.js"&gt;&lt;/script&gt;
&lt;/head&gt;</pre><p>
Proseguiamo includendo prima della chiusura del body (<em>&lt;/body&gt;</em>) le altre librerie:</p><pre class="crayon-plain-tag">&lt;!-- Includo gli scripts in fondo alla pagina per velocizzarne il caricamento --&gt;
 &lt;script src="js/jquery-1.10.2.min.js"&gt;&lt;/script&gt;
 &lt;!-- Includiamo anche underscore.js libreria a cui si appoggia backbone.js --&gt;
 &lt;script src="js/underscore.js"&gt;&lt;/script&gt; 
 &lt;script src="js/backbone.js"&gt;&lt;/script&gt;    
 &lt;!-- il file javascript del nostro esperimento--&gt;
 &lt;script src="js/demo.js"&gt;&lt;/script&gt;</pre><p>
<h2>Il markup HTML</h2>
<p style="text-align: center;"><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2014/03/markup-html.jpg"><img class="size-full wp-image-3440 aligncenter" alt="markup-html" src="http://www.upcreative.net/wp-content/uploads/2014/03/markup-html.jpg" width="690" height="200" /></a></p>
<p>Vediamo ora come impostare il markup HTML all&#8217;interno del documento:</p><pre class="crayon-plain-tag">&lt;!-- header della schermata --&gt;
&lt;nav class="header"&gt;
	&lt;a class="left" href="http://www.upcreative.net/iscriviti-alla-newsletter/"&gt;&lt;i class="fa fa-globe"&gt;&lt;/i&gt; Ulteriori guide&lt;/a&gt;			
	&lt;button href="#" class="right" data-js="new"&gt;&lt;i class="fa fa-plus"&gt;&lt;/i&gt; Nuovo articolo&lt;/button&gt;
	&lt;h1 class="title"&gt;HTML5 Mobile App&lt;/h1&gt;
&lt;/nav&gt;

&lt;!-- wrapper il contenuto della lista --&gt;
&lt;section class="content"&gt;
	&lt;h1&gt;Articoli&lt;/h1&gt;		
	&lt;ul class="list-group" data-js="list"&gt;

	&lt;/ul&gt;
&lt;/section&gt;

&lt;!-- 
	template che useremo per la view del dettaglio della news: il browser ingnora questa parte di codice, poichè all'interno
	del tag 'script', ma possiamo invece risalire a questo template da javacript, tramite l'id
--&gt; 
&lt;script type="text/template" id="article-template"&gt;

	&lt;!-- header della schermata --&gt;
	&lt;nav class="header"&gt;
		&lt;button class="right" data-js="close"&gt;&lt;i class="fa fa-times-circle"&gt;&lt;/i&gt;&lt;/button&gt;
		&lt;h1 class="title"&gt;Dettalgi articolo&lt;/h1&gt;
	&lt;/nav&gt;

	&lt;!-- wrapper per le tab della schermata --&gt;
	&lt;section class="content"&gt;		

		&lt;h1&gt;&lt;%=title%&gt;&lt;/h1&gt;
		&lt;p&gt;Data: &lt;%=createdat.getDate()%&gt; / &lt;%=createdat.getMonth()+1%&gt; / &lt;%=createdat.getFullYear()%&gt;&lt;/p&gt;
		&lt;article&gt;

			&lt;!-- 
			il sistema di templating permette di usare i normali controlli Javascript, 
			in modo da poter controllare se è presente o meno l'immagine per l'articolo 
			--&gt; 

			&lt;%if(image){%&gt;
			&lt;img src="images/&lt;%=image%&gt;" /&gt;
			&lt;%}%&gt;

			&lt;%=article%&gt;

		&lt;/article&gt;

	&lt;/section&gt;

&lt;/script&gt;</pre><p>
Il codice che si trova all&#8217;interno del tag <em>&lt;script type=&#8221;text/template&#8221; id=&#8221;article-template&#8221;&gt;&lt;/script&gt;</em> rappresenta il markup che verrà utilizzato dalla view Backbone.js per la visualizzazione del dettaglio dell&#8217;articolo.</p>
<h2>Il file Javascript</h2>
<p>All&#8217;interno del nostro file Javascript (<em>demo.js</em>) come prima cosa salviamo in una variabile il nome dell&#8217;evento di fine animazione tramite Modernizr, che verrà utilizzato nella view del dettaglio dell&#8217;articolo:</p><pre class="crayon-plain-tag">/* Grazie a modernizr riprendo il nome dell'evento di fine animazione, che cambia a seconda del browser */

var animEndEventNames = {
	'WebkitAnimation' : 'webkitAnimationEnd',
	'OAnimation' : 'oAnimationEnd',
	'msAnimation' : 'MSAnimationEnd',
	'animation' : 'animationend'
};
var animEndEventName = animEndEventNames[ Modernizr.prefixed( 'animation' ) ];</pre><p>
Il passo successivo è subito quello di definire il modello (<em>model</em>) Backbone per rappresentare ogni articolo, e la relativa collezione (<em>collection</em>):</p><pre class="crayon-plain-tag">//definiamo il modello di un articolo
var ArticleModel = Backbone.Model.extend({

    // Attributi predefiniti per il modello, che vengono usati 
    //se non passati al momento dell'inizializzazione    
    defaults: {
        title: "Nessun titolo",
        article: "",
        image: false,
        createdat: new Date()
    }, 
    //elimina l'istanza del model
    clear: function() {
        this.destroy();
    }

});

//definiamo la collection per la lista degli articoli
var ArticleList = Backbone.Collection.extend({ 
    //Impostiamo la referenza al model per questa collection.
    model: ArticleModel
});</pre><p>
Fatto ciò passiamo alla definizione delle <em>views</em> che controllano parte dell&#8217;interfaccia della nostra HTML5 Mobile App.</p>
<p>In particolare useremo due <em>views: </em></p>
<ul>
<li>la prima, ovvero quella che rappresenta l&#8217;app principale, è applicata al body e quindi non deve preoccuparsi di generare nuovo markup HTML, ma di usare quello che abbiamo già inserito nel documento</li>
<li>la seconda, ovvero quella che rappresenta il pannello che mostra i dettagli dell&#8217;articolo, si servirà della parte di markup che abbiamo precedentemente inglobato nel tag <em>&lt;script&gt; </em>con id &#8216;<em>article-template</em>&#8216;.</li>
</ul>
<h4>View generale</h4>
<p style="text-align: center;"><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2014/03/html5-mobile-app-list-view.jpg"><img class="size-full wp-image-3439 aligncenter" alt="html5-mobile-app-list-view" src="http://www.upcreative.net/wp-content/uploads/2014/03/html5-mobile-app-list-view.jpg" width="320" height="505" /></a></p>
<pre class="crayon-plain-tag">//definiamo la view dell'app intera
var AppView = Backbone.View.extend({

    //a differenza della view di dettaglio dell'articolo, dove impostavamo 
    //quale elemento generare al'inizializzazione, qui comunichiamo 
    //quale oggetto già aesistente utilizzare come markup
    el: "body",

    // Deleghiamo gli eventi per la creazione di un nuovo 
    //articolo (il funzionamento ed i selettori sono come quelli di jQuery).
    events: {
    	//evento //selettore 	 //funzione da eseguire
        "click [data-js=list] a":  "showArticle",
        "click [data-js=new]":  "newArticle"
    },

    // Nella funzione di inizializzazione osserviamo l'evento add 
    //della collection legata a questa view, per richiamare la funzione che 
    // inserisce un nuovo elemento nella lista DOM
    initialize: function() {

        //deleghiamo gli eventi della collection alle relative funzioni 

        //evento che si verifica quando un nuovo model viene aggiunto alla collection
        // l'ultimo parametro è una funzione alla quale viene passata l'istanza del model appena aggiunto
        // alla collection
        this.listenTo(this.collection, 'add', this.addArticle);

        //richiamiamo la funzione che aggiunge gli elementi all alla lista
        this.addElements();
    },

    // funzione che crea una nuova view ed aggiunge 
    // l'elemento generato dal render alla lista, in base al modello passato ('articleModel')
    addArticle: function(articleModel) {           
        //qui, per mostrare una soluzione diversa, generiamo del markup senza ricorrere ad una view a se stante
        var compiledTemplate = _.template('&lt;a href="#" class="list-group-item"&gt;&lt;%=title %&gt; - &lt;span class="text-muted"&gt;&lt;%=createdat.getDate()%&gt; / &lt;%=createdat.getMonth()+1%&gt; / &lt;%=createdat.getFullYear()%&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;');
        //aggiungiamo alla lista il markup generato dal sistema di templating, passando i dati in formato Json del model
        this.$("[data-js=list]").append( compiledTemplate(articleModel.toJSON()) );
    },

    showArticle: function(e) {  
    	e.preventDefault();
    	var item = $(e.currentTarget), 					//riprendiamo l'oggetto jQuery del link appena cliccato
    		index = item.index(),	   					//riprendiamo l'indice sulla lista dell'oggetto appena cliccato
    		articleModel = this.collection.at(index);   //riprendiamo il model dalla collection degli articoli in base all'indice

        //creaiamo una nuova istanza della view dell'articolo passando come model quello dell'articolo cliccato
        var view = new ArticleView({model: articleModel});
        //aggiungiamo all'elemento di questa view (quindi il body della pagina) l'oggetto DOM generato dalla funzione di render della view appena istanziata
        this.$el.append(view.render().el);
        //richiamiamo il metodo "show()" interno della view appena creata per avviare l'animazione di entrata
        view.show();    
    },

    // Aggiunge nella lista tutti gli elementi della collection di individui.
    addElements: function() {
        this.collection.each(this.addArticle);
    },

    newArticlesCoounter: 0,
    newArticle: function(){
    	this.newArticlesCoounter++;

    	//creo un nuovo model per l'articolo
    	var newModel = new ArticleModel({
    		title: "Nuovo articolo "+this.newArticlesCoounter,
    		article: "BOOM! Corpo nuovo articolo.."
    	});
    	//aggiungo il model alla collection, in modo da innescare la funzione 'addArticle', 
    	//come stabilito all'interno della funzione 'initialize' di questa view
    	this.collection.add(newModel);

    }
});</pre>
<h4> View di dettaglio</h4>
<p style="text-align: center;"><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2014/03/html5-mobile-app-details.jpg"><img class="size-full wp-image-3441 aligncenter" alt="html5-mobile-app-details" src="http://www.upcreative.net/wp-content/uploads/2014/03/html5-mobile-app-details.jpg" width="320" height="505" /></a></p>
<pre class="crayon-plain-tag">//view per il dettaglio dell'articolo
var ArticleView = Backbone.View.extend({

    // diciamo a backbone che deve inserire il markup del template di questa view all'interno di un oggetto dal tag 'section'
    tagName:  "section",

    //settiamo la classe che deve avere il tag 'section'
    className: "article-wrapper",

 	//impostaiamo l'id del template da cui generare il merkup di questa view
    template: "#article-template",

    //impostazione degli eventi per l'interazione dell'utente (il funzionamento ed i selettori sono come quelli di jQuery).
    events:{
    	//evento //selettore 	 //funzione da eseguire
    	"click [data-js=close]": "hide"
    },

 	//la funzione che viene eseguita al momento dell'inizializzazione di questa view
    initialize: function() {
        //compiliamo il template in una variabile
        this.template = _.template($(this.template).html());

        //rimuoviamo il modal dal DOM quando esso viene nascosto
        this.$el.on("hidden.bs.modal", function(){
            this.remove();
        });
    },

    // Effettua il render del markup della view per il dettaglio dell'articolo, in base al modello con cui questa view è stata inizializzata.
    render: function() {
        $(this.el).html(this.template(this.model.toJSON()));        
        return this;
    },

 	//funzione che mostra l'elemento DOM nell'interfaccia
    show: function(){
    	//aggiungendo la classe 'show-article' al contenitore di questa view 
    	//(elemento 'section.article-wrapper') inneschiamo l'animazione di entrata
        this.$el.addClass("show-article");        
    },
    //funzione che nasconde l'elemento DOM dall'interfaccia
    hide: function(){
    	var _this = this;
    	//aggiungendo la classe 'hide-article' al contenitore di questa view 
    	//(elemento 'section.article-wrapper') inneschiamo l'animazione di uscita
        _this.$el.addClass("hide-article");        
        //al termine della'animazione, rimuoviamo l'oggetto DOM dal documento tramite il metodo backbone 'remove()', in modo da alleggerire il lavoro 
        //della memoria centrale del dispositivo, contribuendo a rendere la nostra applicazione più fluida e performante 
        _this.$el.on( animEndEventName ,function(){
        	_this.remove();
        });        
    }

});</pre>
<h2>Il codice CSS</h2>
<p>Per quanto riguarda gli <strong>stili CSS3</strong>, abbiamo utilizzato delle posizioni assolute per elementi come l&#8217;<em>header, </em>il contenitore della lista ed il tag &lt;<em>section&gt; </em>legato alla view del dettaglio. A quest&#8217;ultimo abbiamo inoltre applicato la tecnica dell&#8217;<strong>accelerazione hardware</strong> (o <em>hardware acceleration</em>) tramite l&#8217;istruzione &#8216;t<em>ransform: translate3d(0,0,0)</em>&#8216;, corredata con i vari <em>prefix</em> per la compatibilità browser, che renderà la nostra HTML5 Mobile App più fluida e performante.</p>
<p>Così facendo, ci assicuriamo delle animazioni fluide e performanti, nel momento in cui all&#8217;elemento &#8216;<em>section.article-wrapper</em>&#8216; vengono aggiunte le classi che le &#8216;innescano': &#8216;.<em>show-article</em>&#8216; e &#8216;.<em>hide-article</em>&#8216;.<em></em></p>
<p>Ecco il codice necessario per realizzare l&#8217;effetto di entrata:</p><pre class="crayon-plain-tag">section.article-wrapper {

  /*stili per il posizionamento*/
  position: fixed;
  left: 0;
  top: 0;      
  right: 0;    
  bottom:0;  
  z-index: 30;

  visibility: hidden;

  /* migliora le prestazioni prevenendo il render della parte 'posteriore' dell'elemento */
  -webkit-backface-visibility: hidden;
  -moz-backface-visibility: hidden;
  -ms-backface-visibility: hidden;
   backface-visibility: hidden;

   /* 
   	forziamo l'utilizzo della tecnica dell'accelerazione hardware per avere aniamzioni più fluide e reattive;
   	mpostando come elemento scatenante per l'effetto la proprietà 'translate3d'
   	il processo di rendering per l'elemento sarà delegato alla GPU (memoria grafica) 
   	prima, dopo e durante l'animazione
   */
   -webkit-transform: translate3d(0,0,0);
   -moz-transform: translate3d(0,0,0);
   -ms-transform: translate3d(0,0,0);
   transform: translate3d(0,0,0);               
}    

section.article-wrapper.show-article{

	/*
	nel momento in cui all'elemento 'section.article-wrapper' viene aggiunta la classe 'show-article'
	innescchiamo l'animazione di entrata specifcandola in corrispondenza dell'attributo 'animation'
	*/

    -webkit-animation: showFromBottom .25s ease both;
    -moz-animation: showFromBottom .25s ease both;
    animation: showFromBottom .25s ease both;

    visibility: visible;
}

section.article-wrapper.hide-article{
    /*
      nel momento in cui all'elemento 'section.article-wrapper' viene aggiunta la classe 'hide-article'
      inneschiamo l'animazione di uscita specificandola in corrispondenza dell'attributo 'animation'
    */
    -webkit-animation: hideToBottom .25s ease both;
    -moz-animation: hideToBottom .25s ease both;
    animation: hideToBottom .25s ease both;
}

/* definizione delle animazioni di entrata e di uscita per la view dell'articolo: muoviamo sempliemente l'elemento in verticale sull'asse delle ordinate */

/*animazione di entrata*/
@-webkit-keyframes showFromBottom {
    from { -webkit-transform: translateY(100%); }
}
@-moz-keyframes showFromBottom {
    from { -moz-transform: translateY(100%); }
}
@keyframes showFromBottom {
    from { transform: translateY(100%); }
}

/*animazione di uscita*/
@-webkit-keyframes hideToBottom {
    to { -webkit-transform: translateY(100%); }
}
@-moz-keyframes hideToBottom {
    to { -moz-transform: translateY(100%); }
}
@keyframes hideToBottom {
    to { transform: translateY(100%); }
}</pre><p>
&nbsp;</p>
<h2>Ultimo step: avviamo la nostra HTML5 Mobile App!</h2>
<p style="text-align: center;"><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2014/03/start-HTML5-Mobile-App.jpg"><img class="size-full wp-image-3442 aligncenter" alt="start-HTML5-Mobile-App" src="http://www.upcreative.net/wp-content/uploads/2014/03/start-HTML5-Mobile-App.jpg" width="690" height="400" /></a></p>
<p>Ora che  abbiamo tutti i pezzi del puzzle possiamo procedere ed avviare la nostra applicazione: per instanziare i nostri componenti ed avviare l’applicazione, torniamo sul file &#8216;<em>demo.js</em>&#8216; e ci serviremo del seguente codice javascript per inserire nella <em>collection</em> qualche articolo predefinito, con tanto di titolo, immagine, corpo dell&#8217;articolo e data, in modo da visualizzarli subito nella lista iniziale:</p><pre class="crayon-plain-tag">$(function(){

	//creiamo una nuova istanza per la collection degli articoli con 4 models iniziali
    var articles = new ArticleList([
        {
            title: "App su upCreative.net",
            image: "1.jpg",
            article: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
        },
        {
            title: "Secondo articolo su upCreative.net",
            image: "2.jpg",
            article: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur"
        },
        {
            title: "Articolo senza immagine 3",
            article: "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        },
        {
            title: "Quarto articolo sulla  lista",
            image: "3.jpg",
            article: "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat"
        }
    ]);
    //creiamo una nuova istanza per la view dell'applicazione 
    //principale associandogli la collection
    var app = new AppView({
        collection : articles
    });

});</pre><p>
BOOM! L&#8217;esperimento è pronto, di seguito puoi consultare la demo o poterti divertire direttamente con i sorgenti.
		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h2>Conclusioni, demo e download</h2>
<hr />
<p><em>Come creare una #HTML5 #MobileApp con #Backbonejs ed il pattern #MVC</em><br /><a href='https://twitter.com/share?text=Come+creare+una+%23HTML5+%23MobileApp+con+%23Backbonejs+ed+il+pattern+%23MVC&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/come-creare-una-html5-mobile-app-con-backbone-js/' target='_blank'>Click To Tweet</a></p>
<hr />
<p>Tramite questa demo è possible intuire, almeno in parte, le potenzialità che backbone ed il pattern MVC mettono a disposizione. Come avrai potuto notare ogni <em>view</em> agisce in modo &#8220;<strong>non intrusivo</strong>&#8221; nei confronti degli altri elementi: ognuna di esse &#8220;resta in ascolto&#8221; ad eventuali modifiche apportate al <em>model</em> o alla <em>collection</em> associati, attraverso l&#8217;istruzione &#8216;<em>this.listenTo</em>&#8216;.</p>
<p>Quando ciò accade, è possibile effettuare le relative modifiche al DOM della <em>view</em> senza doverle richiamare da parti esterne dell&#8217;applicazione ma agendo del tutto <strong>autonomamente</strong>. Di conseguenza l&#8217;applicazione stessa risulta maggiormente <strong>scalabile</strong> ed <strong>estendibile</strong> secondo le proprie esigenze.</p>
<p>E tu cosa ne pensi? Hai mai utilizzato Backbone per i tuoi progetti? Fammelo sapere lasciando un commento!
		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			Aiutami a condividere la risorsa per ottenere la <strong>demo</strong> ed il <strong>download</strong>:</p>

		</div> 
	</div> <div class="g-hr">
						<span class="g-hr-h">
							<i class="fa fa-chevron-down"></i>
						</span>
					</div><div class="g-cols color_alternate w-actionbox"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Crea la tua mobile app in HTML, CSS3 e Javascript</h3>
<p>Utilizzando questa tecnica insieme a molte altre, ho realizzato più di 10 mobile app in HTML, CSS3 e Javascript (tra cui <a title="Tint HTML mobile app" href="http://www.upcreative.net/tint-weather-app/">Tint</a> e <a title="Dieta SI o NO? HTML Mobile app" href="http://www.upcreative.net/app-dieta-si-o-no/">Dieta SI o NO?</a>).</p>
<p>Se anche tu vuoi realizzare la tua applicazione in HTML, CSS e javascript da distribuire nei vari store, forse potrebbe interessarti il mio e-book <strong><a title="HTML Mobile Accelerato - Come creare una mobile app in HTML, CSS e Javacript" href="http://www.upcreative.net/html-mobile-accelerato/">HTML Mobile Accelerato</a>.</strong>
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_single_image wpb_content_element align_center">
		<div class="wpb_wrapper">
			
			<a href="http://www.upcreative.net/html-mobile-accelerato/"><img width="563" height="418" src="http://www.upcreative.net/wp-content/uploads/2013/11/HTML-mobile-accelerato-ebook-cover1.png" class="attachment-full" alt="HTML-mobile-accelerato-ebook-cover" /></a>
		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="widget_wysija_cont shortcode_wysija"><div id="msg-form-wysija-shortcode6adb4b432f342-4" class="wysija-msg ajax"></div><form id="form-wysija-shortcode6adb4b432f342-4" method="post" action="#wysija" class="widget_wysija shortcode_wysija">
<p class="wysija-paragraph">
    
    
    	<input type="text" name="wysija[user][email]" class="wysija-input validate[required,custom[email]]" title="Inserisci la tua mail" placeholder="Inserisci la tua mail" value="" />
    
    
    
    <span class="abs-req">
        <input type="text" name="wysija[user][abs][email]" class="wysija-input validated[abs][email]" value="" />
    </span>
    
</p>
<input class="wysija-submit wysija-submit-field" type="submit" value="Tienimi aggiornato/a" />

    <input type="hidden" name="form_id" value="4" />
    <input type="hidden" name="action" value="save" />
    <input type="hidden" name="controller" value="subscribers" />
    <input type="hidden" value="1" name="wysija-page" />

    
        <input type="hidden" name="wysija[user_list][list_ids]" value="4,1" />
    
 </form></div>
		</div> 
	</div> </div></div></div></div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/come-creare-una-html5-mobile-app-con-backbone-js/">Come creare una HTML5 Mobile App con Backbone.js</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/come-creare-una-html5-mobile-app-con-backbone-js/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Performance CSS3: consigli per ottimizzare le animazioni</title>
		<link>https://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/</link>
		<comments>https://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/#comments</comments>
		<pubDate>Thu, 21 Nov 2013 21:43:20 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2511</guid>
		<description><![CDATA[<p>The post <a rel="nofollow" href="https://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/">Performance CSS3: consigli per ottimizzare le animazioni</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Da sempre il web designer/developer deve sostenere la famosa dura lotta della <strong>compatibilità browser,</strong> con un occhio di riguardo soprattutto per Internet Explorer, ed in particolar modo per l&#8217;utilizzo delle <strong>numerose funzionalità CSS3,</strong> che contribuiscono ad incrementare la qualità e la <strong>user experience</strong> di ogni interfaccia.</p>
<p>Negli ultimi tempi l&#8217;interpretazione di animazioni, transizioni e altre proprietà CSS3 su tutti i browser sembra una meta sempre meno lontana, per cui molti <strong>front-end developer</strong>, compreso il sottoscritto, cercano di impiegarli il più possibile all&#8217;interno dei loro progetti.</p>
<p>Tuttavia nell&#8217;utilizzare funzionalità del genere bisogna fare attenzione alle <strong>performance CSS3</strong> del dispositivo/browser su cui dovranno &#8220;girare&#8221;, in particolare se si tratta di quelli mobili, molto meno potenti rispetto ai desktop.</p>
<h2>Un esperienza a riguardo</h2>
<p>Recentemente ho sviluppato e pubblicato nell&#8217;App Store <strong><a title="Tint - Applicazione Meteo sviluppata interamente in HTML5 e CSS3" href="http://www.upcreative.net/tint-weather-app/">Tint</a></strong>, un&#8217;applicazione realizzata interamente con <strong>markup HTML5</strong>, animazioni <strong>CSS3</strong> e l&#8217;ausilio di <strong><a title="Backbone framework per realizzare applicazioni Javascript in HTML5 e CSS3" href="http://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/">Backbone</a></strong> (che approfondirò in un articolo futuro), riscuotendo anche un notevole successo in fatto di download.</p>

		</div> 
	</div> <div class="g-cols"><div class="one-half">
	<div class="wpb_single_image wpb_content_element animate_afl align_center">
		<div class="wpb_wrapper">
			
			<img width="365" height="276" src="http://www.upcreative.net/wp-content/uploads/2013/11/Tint-Weather-App-available-on-app-store.jpg" class="attachment-full" alt="Tint-Weather-App-available-on-app-store" />
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_single_image wpb_content_element animate_afr align_center">
		<div class="wpb_wrapper">
			
			<img width="649" height="431" src="http://www.upcreative.net/wp-content/uploads/2013/11/multiple-locations-view.jpg" class="attachment-full" alt="multiple-locations-view" />
		</div> 
	</div> </div></div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Ma perché ho introdotto Tint?</p>
<p>In questo articolo ti voglio parlare di <strong>una lezione importante nell&#8217;ottimizzare performance CSS3 di animazioni, transizioni ed effetti </strong>applicati ad elementi DOM, che ho personalmente imparato durante la mia esperienza nello sviluppo di Tint, la quale ha contribuito ad incrementarne notevolmente le prestazioni.</p>
<p>Nonostante sia da molto tempo che mi occupo di interfacce web, questa è stata la prima volta che ho avuto l&#8217;esigenza di ottimizzare al massimo le prestazioni in dispositivi che, per caratteristiche hardware, riescono difficilmente a supportare certi tipi di animazioni e transizioni.</p>
<p>Ho dovuto pertanto cambiare il modo di realizzare alcuni effetti che su smartphone si arrestavano o mostravano uno sfarfallio (quanto lo odio!), mentre per desktop non davano nessun problema.</p>
<h2>Punto focale: il rendering</h2>
<p>Quando parliamo di <strong>prestazioni su un browser</strong>, dobbiamo pensare in particolare al <strong>rendering</strong> e su come esso rappresenti la ragione principale per le scarse prestazioni derivanti dai nostri stili CSS3.</p>
<p>Mi spiego meglio:</p>
<p>i vari step che compongono il processo in base al quale il browser passa dalla &#8220;lettura&#8221; del DOM al &#8220;disegno&#8221; sullo schermo, si possono riassumere in 3 fasi principali, nell&#8217;ordine:</p>
<ol>
<li><strong>Calcolo dei stili</strong>: in questa prima parte vengono calcolate e definite tutte quelle proprietà che definiscono la morfologia dell&#8217;elemento, come width, height, margin, padding, font-size, top, left ecc.</li>
<li><strong>Disegno dell&#8217;elemento</strong>: è il momento in cui l&#8217;elemento viene &#8220;arricchito&#8221; con proprietà come ombra, background, outline, border ecc..</li>
<li><strong>Creazione dei layers</strong>: qui vengono creati i layer dei &#8220;disegni&#8221; appena creati, che si differenziano in due categorie: quelli per il render, i quali definiscono la struttura ad albero di elementi e sotto-elementi, e quelli grafici, che vengono creati ogni volta che la GPU viene chiamata in causa. Possiamo dire quindi che quest&#8217;ultimo processo interessa proprietà CSS3 come translate, transform, scale, rotate ecc..</li>
</ol>
<p>La cosa più importante su cui soffermarsi è il fatto che queste tre operazioni vengono eseguite dal browser in coda. Per cui se ad un elemento DOM già disegnato sullo schermo, andiamo a modificare proprietà classificate nel primo punto, poi dovranno essere rieseguiti anche gli altri due step.</p>
<p>Se invece modifichiamo attributi appartenenti al secondo step, il browser si preoccuperà di eseguire anche il terzo step.</p>
<p>Infine, modificando proprietà classificate nell&#8217;ultimo step, il lavoro del browser sarà alleggerito notevolmente perché non dovrà rieseguire gli step precedenti.</p>
<p>Questo discorso vale in linea generale per tutti i tipi di browser, a parte il nostro solito amico/nemico Internet Explorer, del quale non abbiamo molte informazioni sul processo di rendering (confidiamo nelle future release).</p>
<h3>Tutto questo per dire cosa?</h3>
<p>Beh, se ho esposto bene il funzionamento di rendering, sarà facile darsi una risposta:</p>
<blockquote><p><strong>al fine ottimizzare al massimo le prestazioni di un&#8217;animazione bisogna fare in modo che il browser prenda la strada più corta per realizzarla</strong>.</p></blockquote>
<p>Faccio un esempio banale.</p>
<p>Se dobbiamo spostare una <em>div</em> dalla parte superiore del documento a quella inferiore in modo animato, invece di applicare l&#8217;animazione all&#8217;attributo <em>top</em> o <em>bottom, </em>che costringerebbe il browser a ripetere tutte e 3 le fasi del processo per ogni singolo frame dell&#8217;animazione, la applicheremo alla proprietà <em>transform: translate</em> ( o <em>transform: translate3d</em>) le quali interesseranno solo l&#8217;ultimo dei 3 step.</p>
<p>In questo modo <strong>aumenteremo in modo considerevole la fluidità degli effetti dei nostri progetti</strong>.</p>

		</div> 
	</div> <div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h4>Codice poco performante</h4>

		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h4>Codice performante</h4>

		</div> 
	</div> </div></div><div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<pre class="crayon-plain-tag">div#quadrato{
    position:absolute;
    top:100px;
    left:100px;
    width:100px;
    height: 100px;
    background:red;

   /* definiamo la transizione su tutte le proprietà */
    -webkit-transition: all .3s ease;
       -moz-transition: all .3s ease;
        -ms-transition: all .3s ease;
         -o-transition: all .3s ease;
            transition: all .3s ease;
}
/*classe per l'animazione*/
div#quadrato.animato{
    top:300px;
}</pre>

		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<pre class="crayon-plain-tag">div#quadrato{
    position:absolute;
    top:100px;
    left:100px;
    width:100px;
    height: 100px;
    background:red;

   /* definiamo la transizione su tutte le proprietà */
    -webkit-transition: all .3s ease;
       -moz-transition: all .3s ease;
        -ms-transition: all .3s ease;
         -o-transition: all .3s ease;
            transition: all .3s ease;
}
/*classe per l'animazione*/
div#quadrato.animato{
    -webkit-transform: translateY(-200px);
       -moz-transform: translateY(-200px);
        -ms-transform: translateY(-200px);
         -o-transform: translateY(-200px);    
            transform: translateY(-200px);
}</pre>

		</div> 
	</div> </div></div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Dall&#8217;esempio possiamo vedere due modi diversi di realizzare la stessa animazione, con performance CSS3 completamente differenti.</p>
<p>Di seguito elenco le proprietà per ognuno dei tre (macro) step.</p>

		</div> 
	</div> </div></div><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Step 1: calcolo degli stili</h3>

		</div> 
	</div> <div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<ul>
<li>border</li>
<li>border-width</li>
<li>display</li>
<li>font-size</li>
<li>font-weight</li>
<li>font-famliy</li>
<li>text-align</li>
<li>overflow</li>
<li>overflow-y</li>
<li>white-space</li>
<li>clear</li>
<li>line-height</li>
</ul>

		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<ul>
<li>width</li>
<li>height</li>
<li>margin</li>
<li>padding</li>
<li>top</li>
<li>left</li>
<li>bottom</li>
<li>right</li>
<li>position</li>
<li>overflow</li>
<li>vertical-align</li>
<li>min-height</li>
</ul>

		</div> 
	</div> </div></div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Step 2: disegno dell&#8217;elemento</h3>

		</div> 
	</div> <div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<ul>
<li>background</li>
<li>background-image</li>
<li>background-position</li>
<li>background-repeat</li>
<li>background-size</li>
<li>border-radius</li>
<li>border-style</li>
<li>text-decoration</li>
</ul>

		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<ul>
<li>outline</li>
<li>outline-color</li>
<li>outline-style</li>
<li>outline-width</li>
<li>box-shadow</li>
<li>color</li>
<li>visibility</li>
</ul>

		</div> 
	</div> </div></div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Step 3: creazione dei layers</h3>

		</div> 
	</div> <div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Tutte le proprietà <em>transform</em>, come per esempio <em>translate, matrix, scale, rotate, skew e perspective.</em></p>

		</div> 
	</div> </div></div></div></div><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h2>Conclusioni</h2>
<p>Una volta preso in considerazione questo importante discorso, <strong>la fluidità delle animazioni e transizioni applicate ai vari elementi della mia app Tint è aumentata in modo considerevole</strong>, avvicinandosi sempre di più a quella di applicazioni native (se vuoi vedere il risultato l&#8217;<a title="Tint HTML5 app su App Store" href="https://itunes.apple.com/us/app/tint-weather/id742161441">app è scaricabile nell&#8217;app store</a>).</p>
<p>Spero quindi che anche tu applicherai questo importantissimo concetto nel tuo prossimo lavoro.</p>
<p>Buon divertimento!</p>

		</div> 
	</div> <div class="g-hr">
						<span class="g-hr-h">
							<i class="fa fa-star"></i>
						</span>
					</div><div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<div>Hey! Sto scrivendo un e-book su come aumentare le performance e la fluidità per le tue HTML mobile app! Segui i consigli e le tecniche di cui mi sono servito per creare le mie applicazioni (come <a title="Le mie applicazioni HTML5" href="http://www.upcreative.net/html5-mobile-apps/">Tint, Dieta SI o NO?</a>).</div>
<div>Iscriviti alla newsletter per sapere quando sarà pronto!</div>

		</div> 
	</div> 
	<div class="wpb_single_image wpb_content_element align_center">
		<div class="wpb_wrapper">
			
			<img width="563" height="418" src="http://www.upcreative.net/wp-content/uploads/2013/11/HTML-mobile-accelerato-ebook-cover1.png" class="attachment-full" alt="HTML-mobile-accelerato-ebook-cover" />
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h4 style="text-align: center;"><strong>HTML Mobile Accelerato (E-book)</strong></h4>
<p style="text-align: center;">Lascia la tua email per ricevere aggiornamenti e sapere quando sarà disponibile</p>
<div style="text-align: center;"><div class="widget_wysija_cont shortcode_wysija"><div id="msg-form-wysija-shortcode6adb4b4374356-4" class="wysija-msg ajax"></div><form id="form-wysija-shortcode6adb4b4374356-4" method="post" action="#wysija" class="widget_wysija shortcode_wysija">
<p class="wysija-paragraph">
    
    
    	<input type="text" name="wysija[user][email]" class="wysija-input validate[required,custom[email]]" title="Inserisci la tua mail" placeholder="Inserisci la tua mail" value="" />
    
    
    
    <span class="abs-req">
        <input type="text" name="wysija[user][abs][email]" class="wysija-input validated[abs][email]" value="" />
    </span>
    
</p>
<input class="wysija-submit wysija-submit-field" type="submit" value="Tienimi aggiornato/a" />

    <input type="hidden" name="form_id" value="4" />
    <input type="hidden" name="action" value="save" />
    <input type="hidden" name="controller" value="subscribers" />
    <input type="hidden" value="1" name="wysija-page" />

    
        <input type="hidden" name="wysija[user_list][list_ids]" value="4,1" />
    
 </form></div></div>
<div style="text-align: center;"></div>
<div style="text-align: center;"><a title="E-book HTML5 Mobile Accelerato" href="http://www.upcreative.net/html-mobile-accelerato/">Clicca qui per avere maggiori informazioni</a></div>

		</div> 
	</div> </div></div></div></div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/">Performance CSS3: consigli per ottimizzare le animazioni</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Tutorial: Backbone web app responsive con Bootstrap 3</title>
		<link>https://www.upcreative.net/tutorial-backbone-web-app-con-bootstrap-3/</link>
		<comments>https://www.upcreative.net/tutorial-backbone-web-app-con-bootstrap-3/#comments</comments>
		<pubDate>Wed, 13 Nov 2013 11:19:29 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[javscript]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2473</guid>
		<description><![CDATA[<p>In un precedente articolo ho sottolineato il ruolo fondamentale che può rappresentare Backbone per la realizzazione di una MVC javascript web application, elencando anche i vari componenti che la libreria mette a disposizione, oltre ad alcune applicazioni con essa realizzate. Su lobaedesign.com</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/tutorial-backbone-web-app-con-bootstrap-3/">Tutorial: Backbone web app responsive con Bootstrap 3</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>In un <a title="Usare Backbone.js per realizzare web applications" href="http://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/">precedente articolo</a> ho sottolineato il ruolo fondamentale che può rappresentare <a title="Backbone frame work javascript per web app" href="http://backbonejs.org"><strong>Backbone</strong></a> per la realizzazione di una <strong>MVC</strong> <strong>javascript web application</strong>, elencando anche i vari componenti che la libreria mette a disposizione, oltre ad alcune applicazioni con essa realizzate.</p>
<p>Su <a href="http://lobaedesign.com">lobaedesign.com</a> invece, ho introdotto l&#8217;indipendenza della view dagli altri componenti con un tutorial su <a title="Tutorial Backbone.js: come realizzare un orologio analogico CSS3 e JavaScript con animazione" href="http://www.lobaedesign.com/tutorial-backbone-js-come-realizzare-un-orologio-css3-e-javascript-con-animazione/">come realizzare un orologio analogico CSS3 e JavaScript con animazione</a>, e su come la stessa view aggiorna gli elementi dell&#8217;interfaccia &#8220;<strong>osservando</strong>&#8221; il cambiamento di un model.</p>
<p>In questo post voglio introdurre invece altri due componenti per la creazione di una <strong>backbone web app</strong>:</p>
<ul>
<li><strong>la collection</strong>, ovvero la lista secondo la quale organizzare i model</li>
<li><strong>il sistema di templating</strong> della libreria <a title="Underscore.js - sistema di templating per web app" href="http://underscorejs.org">underscore.js</a>, per la generazione del markup HTML</li>
</ul>
<p>Lo farò attraverso un semplice tutorial che implementa il framework bootstrap 3 nel documento e usa due view diverse legate allo stesso model ed una alla lista.</p>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/11/Tutorial-Backbone-web-app-responsive-con-Bootstrap-3.jpg"><img class="alignnone size-full wp-image-2489" alt="Tutorial-Backbone-web-app-responsive-con-Bootstrap-3" src="http://www.upcreative.net/wp-content/uploads/2013/11/Tutorial-Backbone-web-app-responsive-con-Bootstrap-3.jpg" width="690" height="400" /></a></p>
<div class="g-cols">
<div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/tutorials/13112013-backbone-responsive-we-app/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-eye-open"></i>Demo</span></a></div>
 
		</div> 
	</div> </div>
<div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/download/2491/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-download-alt"></i>Download</span></a></div>
 
		</div> 
	</div> </div>
</div>
<p>Il nostro intento sarà quindi quello di creare una <strong>backbone </strong><strong>web app responsive</strong> che mostra una lista di persone, ciascuna con informazioni proprie come nome, sesso, occupazione, e descrizione, e con possibilità da parte dell&#8217;utente di creare, modificare, eliminare una persona, oltre che poter visualizzare una modal con delle informazioni aggiuntive cliccando nel nome della lista.</p>
<h2>Impostazione del documento</h2>
<p>Come prima operazione, aggiungiamo al nostro documento, prima della chiusura del tag <em>body</em>,  le librerie di cui abbiamo bisogno:</p><pre class="crayon-plain-tag">&lt;script src="js/jquery-1.10.2.min.js"&gt;&lt;/script&gt; &lt;!-- jquery --&gt;
&lt;script src="js/bootstrap.min.js"&gt;&lt;/script&gt; &lt;!-- bootstrap per il modal--&gt;

&lt;script src="js/underscore-min.js"&gt;&lt;/script&gt; &lt;!-- libreria di supporto per backbone e per il sistema di templating --&gt;
&lt;script src="js/backbone-min.js"&gt;&lt;/script&gt;&lt;!-- backbone.js --&gt;

&lt;script src="js/demo.js"&gt;&lt;/script&gt; &lt;!-- il file js della nostra applicazione --&gt;</pre><p>
Backbone.js e Undersore.js sono scaricabili dai rispettivi link:</p>
<ul>
<li><a title="Sito web Backbone.js" href="http://backbonejs.org"><span style="color: #000000;">Sito web Backbone.js</span></a></li>
<li><a title="Sito web Underscore.js" href="http://underscorejs.org"><span style="color: #000000;">Sito web Underscore.js</span></a></li>
</ul>
<h2>Il markup HTML</h2>
<p>Andiamo a vedere il markup HTML della view principale dell&#8217;applicazione, ovvero quello che comprende il form di inserimento e la lista:</p><pre class="crayon-plain-tag">&lt;!-- form di creazione dell'individuo --&gt;   

&lt;div class="col-md-4 col-lg-4 well well-sm"&gt; 
    &lt;legend&gt;&lt;i class="glyphicon glyphicon-user"&gt;&lt;/i&gt; Aggiungi individuo&lt;/legend&gt;
    &lt;form action="#" id="add-form" method="post" class="form" role="form"&gt;
        &lt;div class="row"&gt;
            &lt;div class="col-xs-8 col-md-8"&gt;
                &lt;input class="form-control" name="name" placeholder="Nome" type="text" /&gt;
            &lt;/div&gt;
            &lt;div class="col-xs-4 col-md-4"&gt;                    
                &lt;select name="gender" class="form-control"&gt;
                    &lt;option value="M"&gt;Maschio&lt;/option&gt;
                    &lt;option value="F"&gt;Femmina&lt;/option&gt;
                &lt;/select&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;input class="form-control" name="occupation" placeholder="Occupazione" type="text" /&gt;

        &lt;label for="notes"&gt;Note&lt;/label&gt;
        &lt;textarea name="notes" id="notes" class="form-control" rows="3"&gt;&lt;/textarea&gt;
        &lt;button class="btn btn-block button add-person" type="submit"&gt;Aggiungi&lt;/button&gt;
    &lt;/form&gt;
&lt;/div&gt;

&lt;!-- la lista degli individui --&gt;

&lt;div class="col-md-8 col-lg-8"&gt;
 	&lt;ul class="list-group"&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre><p>
<h2>I template di Underscore.js</h2>
<p>Impostiamo ora il markup HTML dei template delle view secondo il<strong> sistema di templating di underscore.js</strong>; i metodi per comunicare alla view backbone quale template utilizzare per il rendering del markup da inserire poi nel documento sono principalmente tre:</p>
<ol>
<li>Specificare il template sottoforma di <strong>variabile string</strong> nello script</li>
<li>Specificare il <strong>rifermento al template</strong> il cui markup è stato &#8220;posizionato&#8221; nel documento</li>
<li>Utilizzare librerie come <a title="Requirejs.org - Caricare contenuti nel documento in modo asincrono" href="http://requirejs.org"><strong>require.js</strong></a> per &#8220;leggere&#8221; in <strong>modo asincrono</strong> il contenuto del template da un file esterno (solitamente di usa un file con estensione .html)</li>
</ol>
<p>Personalmente preferisco utilizzare l&#8217;ultima opzione, soprattutto nel caso di web app ad architettura molto complessa, per due motivi principali:</p>
<ul>
<li>lasciare il nostro documento più pulito possibile</li>
<li>migliore organizzazione del progetto per quanto riguarda la struttura dei file</li>
</ul>
<p>In questo tutorial tuttavia prenderemo in considerazione il secondo metodo.</p>
<p><strong><em>Per saperne di più sui sistemi di javascript templating leggi</em>: </strong></p>
<ul>
<li><a title="I sistemi di javascript templating e le migliori librerie" href="http://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/">I sistemi di javascript templating e le migliori librerie</a></li>
</ul>
<p>Per l&#8217;esperimento definiremo 3 view, quella dell&#8217;applicazione principale (che comprende il form di inserimento e l&#8217;<em>ul</em> della lista), quella di ogni singolo elemento del lista, e quella della modal delle informazioni aggiuntive.</p>
<p>Poiché per la prima delle tre imposteremo come elemento di riferimento il body stesso del documento, andiamo a definire il markup dei template delle altre due view:</p><pre class="crayon-plain-tag">&lt;!-- *********** Template delle Views ************** --&gt;

&lt;!-- modal dell'elemento della lista --&gt;

&lt;script type="text/template" id="person-template"&gt;

    &lt;div class="view"&gt; 
        &lt;div class="action pull-right"&gt;
            &lt;button type="button" class="btn btn-xs button open-modal" title="View Modal"&gt;
                &lt;span class="glyphicon glyphicon-eye-open"&gt;&lt;/span&gt;
            &lt;/button&gt;
            &lt;button type="button" class="btn btn-xs button edit-view" title="Edit"&gt;
                &lt;span class="glyphicon glyphicon-pencil"&gt;&lt;/span&gt;
            &lt;/button&gt;
            &lt;button type="button" class="btn btn-xs button person-delete" title="Delete"&gt;
                &lt;span class="glyphicon glyphicon-trash"&gt;&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;

        &lt;h4&gt;&lt;%=name%&gt;&lt;/h4&gt;            
        &lt;div class="gender-info"&gt;
           	Sesso: &lt;strong&gt;&lt;%=gender%&gt;&lt;/strong&gt; - Occupazione: &lt;strong&gt;&lt;%=occupation%&gt;&lt;/strong&gt;
        &lt;/div&gt;
     &lt;/div&gt;

     &lt;div class="edit"&gt;

         &lt;form action="#" class="form" role="form"&gt;
            &lt;div class="row"&gt;
                &lt;div class="col-xs-3 col-md-3"&gt;
                    &lt;input class="form-control" name="name" value="&lt;%=name%&gt;" placeholder="Nome" type="text" /&gt;
                &lt;/div&gt;
                &lt;div class="col-xs-3 col-md-3"&gt;
                    &lt;input class="form-control" value="&lt;%=occupation%&gt;" name="occupation" placeholder="Occupazione" type="text" /&gt;
                &lt;/div&gt;
                &lt;div class="col-xs-2 col-md-2"&gt;                    
                    &lt;select name="gender" class="form-control"&gt;
                        &lt;option value="M" &lt;%if(gender=='M'){%&gt;selected&lt;%}%&gt;&gt;Maschio&lt;/option&gt;
                        &lt;option value="F" &lt;%if(gender=='F'){%&gt;selected&lt;%}%&gt;&gt;Femmina&lt;/option&gt;
                    &lt;/select&gt;
                &lt;/div&gt;
                &lt;div class="col-xs-2 col-md-2"&gt;
                    &lt;button class="btn btn-sm btn-block button save" type="submit"&gt;Salva&lt;/button&gt;
                &lt;/div&gt;
                &lt;div class="col-xs-2 col-md-2"&gt;
                    &lt;a href="#" class="btn btn-sm btn-default btn-block cancel"&gt;Annulla&lt;/a&gt;
                &lt;/div&gt;
            &lt;/div&gt;		            
            &lt;textarea name="notes" id="notes" class="form-control" rows="3"&gt;&lt;%=notes%&gt;&lt;/textarea&gt;
        &lt;/form&gt;

     &lt;/div&gt;

&lt;/script&gt;

&lt;!-- modal delle informazioni aggiuntive--&gt;

&lt;script type="text/template" id="modal-template"&gt;

   &lt;div class="modal-dialog"&gt;
    &lt;div class="modal-content"&gt;
      &lt;div class="modal-header"&gt;
        &lt;button type="button" class="close" data-dismiss="modal" aria-hidden="true"&gt;&amp;times;&lt;/button&gt;
        &lt;h4 class="modal-title"&gt;&lt;%=name%&gt;&lt;/h4&gt;
      &lt;/div&gt;
      &lt;div class="modal-body"&gt;
        	&lt;div class="gender-info"&gt;
               	Sesso: &lt;strong&gt;&lt;%=gender%&gt;&lt;/strong&gt; - Occupazione: &lt;strong&gt;&lt;%=occupation%&gt;&lt;/strong&gt;
            &lt;/div&gt;
            &lt;p class="gender-notes"&gt;
               	&lt;%=notes%&gt;
            &lt;/p&gt;
      &lt;/div&gt;
      &lt;div class="modal-footer"&gt;
        &lt;button type="button" class="btn button" data-dismiss="modal"&gt;Chiudi&lt;/button&gt;
      &lt;/div&gt;
   &lt;/div&gt;

&lt;/script&gt;</pre><p>
Dal codice puoi notare che ogni template è stato definito all&#8217;interno dell tag <em>script</em> in cui è stato impostato un attributo <strong><em>type</em></strong> con valore <em><strong>text/template</strong>. </em>Così facendo il <strong>browser ignorerà questa porzione di codice</strong> che invece sarà <strong>raggiungibile da Javascript</strong> tramite l&#8217;attribuito <em>id</em>.</p>
<h2>Il file JavaScript</h2>
<p>Passiamo ora alla definizione dei vari componenti backbone della nostra applicazione, in primis occupiamoci dell&#8217;astrazione dei dati, <strong>il model della persona:</strong></p><pre class="crayon-plain-tag">//definiamo il modello dell'individuo
var PersonModel = Backbone.Model.extend({

	// Attributi predefiniti per il modello, che vengono usati 
	//se non passati al momento dell'inizializzazione	
	defaults: {
		gender: "M",
		createdat: new Date()
	},

	initialize: function() {  

	},

	//elimina l'istanza del model
	clear: function() {
		this.destroy();
	}

});</pre><p>
<strong>Definiamo ora la collection</strong> in cui tutte le istanze del model appena definito verranno organizzate:</p><pre class="crayon-plain-tag">//definiamo la collection degli individui
var PersonList = Backbone.Collection.extend({

	// Impostiamo la referenza al model per questa collection.
	model: PersonModel,

	url: "#",

	// Filtra tutti gli individui Maschi o Femmina (in base al parametro passato).
	getGender: function(gender) {
		return this.where({gender: gender});
	}

});</pre><p>
Ora che abbiamo definito la nostra (semplicissima) struttura dei dati, vediamo <strong>l&#8217;impostazione delle view.</strong></p>
<h3>La view dell&#8217;elemento della lista</h3>
<pre class="crayon-plain-tag">//impostiamo la view della persona per come elemento nella lista

var PersonView = Backbone.View.extend({

	// diciamo a backbone che il tag deve essere una li
	tagName:  "li",

	//settiamo la classe da impostare al tag li per usare gli stili bootstrap e l'animazione in entrata
	className: "list-group-item animated",

	// Coumunichiamo alla view a quale template far riferimento.
	template: '#person-template',

	// Bindiamo gli eventi agli elementi di questa view (i selettori funzionano come jQuery).
	events: {
		"click .person-delete"        : "deletePerson",
		"click .edit-view"   		  : "toggleView",
		"click .cancel"				  : "toggleView",
		"submit form"			  	  : "savePerson",
		"click .open-modal"			  : "openModal"	
	},

	//questa funzione viene eseguita ogni volta che viene creata 
	//una nuova istanza per questa view
	initialize: function() {

		//compiliamo il template in una variabile
		this.template = _.template($(this.template).html());

		//osserviamo l'evento change del model dell'individuo per fare in modo che 
		//quando ciò accade anche il markup della relativa view venga aggiornato
		this.listenTo(this.model, 'change', this.toggleView);

		//osserviamo l'evento destroy del model dell'individuo per fare in modo che 
		//quando ciò accade anche la relativa view venga rimossa
		this.listenTo(this.model, 'destroy', this.removeFromDOM);
	},

	// Effettua il render dei contenuti del markup della view nella lista.
	render: function() {
		$(this.el).html(this.template(this.model.toJSON()));
		return this;
	},

	//visualizza il modal per le informazioni dell'individuo
	openModal: function(){
		var model = this.model;
		var view = new ModalView({model: model});
		$("body").append(view.render().el);
		///richiamiamo la funzione open della view appena creata
		view.open();
	},

	// Visualizza o nasconde i campi di editing per questa view. 
	toggleView: function() {	
		//riaggiorniamo la vista e cambiamo la classe per la visualizzazione con jQuery
		this.render();
		this.$el.toggleClass("edit");
	},

	//salva i dati modificati dell'indivuduo
	savePerson: function(e){
		e.preventDefault();

		//riprendiamo i dati del nuovo individuo
		var name = $.trim(this.$("[name='name']").val()),
			gender = this.$("[name='gender']").val(),
			occupation = $.trim(this.$("[name='occupation']").val()),
			notes = $.trim(this.$("[name='notes']").val());

	    //se non tutti i campi sono stati compilati, interrompiamo l'operazione
		if(!name.length  || ! occupation.length || !notes.length)
			return;

		//impostiamo i nuovi dati per il model
		this.model.set({
			name: name,
			gender: gender,
			occupation: occupation,
			notes: notes
		});
		//salviamo il model
		this.model.save();
	},

	removeFromDOM: function(){
		//aggiungiamo la classe per l'animazione di uscita, 
		//e alla fine dell'animazione (sappiamo che dura 1 secondo)
		//rimuoviamo l'elemento DOM dal documento
		var that = this;
		that.$el.addClass("hinge");
		setTimeout(function(){
			that.remove();
		}, 1010);		
	},

	// Rimuove la persona distruggendo il relativo model.
	deletePerson: function() {
		this.model.clear();
	}

});</pre>
<h3> La view del modal delle informazioni aggiuntive</h3>
<pre class="crayon-plain-tag">var ModalView = Backbone.View.extend({

	// diciamo a backbone che il tag deve essere una div
	tagName:  "div",

	//settiamo la classe da impostare al tag li per usare gli stili bootstrap e l'animazione in entrata
	className: "modal fade",

	template: "#modal-template",

	initialize: function() {
		//compiliamo il template in una variabile
		this.template = _.template($(this.template).html());

		//rimuoviamo il modal dal DOM quando esso viene nascosto
		this.$el.on("hidden.bs.modal", function(){
			this.remove();
		});
	},

	// Effettua il render dei contenuti del markup della view nella lista.
	render: function() {
		$(this.el).html(this.template(this.model.toJSON()));		
		return this;
	},

	open: function(){
		this.$el.modal("show");
	}

});</pre>
<h3> La view dell&#8217;applicazione</h3>
<pre class="crayon-plain-tag">//definiamo la view dell'app intera
var AppView = Backbone.View.extend({

		//a differenza della view dell'individuo, dove impostavamo 
		//quale elemento generare al'inizializzazione, qui comunichiamo 
		//quale oggetto già aesistente utilizzare come markup
		el: "body",

		// Deleghiamo gli eventi per la creazione di un nuovo 
		//individuo (il funzionamento ed i selettori sono come quelli di jQuery).
		events: {
			"submit #add-form":  "create"
		},

		// Nella funzione di inizializzazione osserviamo l'evento add 
		//della collection legata a questa view, per richiamare la funzione che 
		// inserisce un nuovo elemento nella lista DOM
		initialize: function() {

			var todos = this.collection;

			//deleghiamo gli eventi della collection alle relative funzioni 

			//evento che si verifica quando un nuovo model viene aggiunto alla collection
			// l'ultimo parametro è una funzione alla quale viene passata l'istanza del model appena aggiunto
			// alla collection
			this.listenTo(this.collection, 'add', this.addPerson);

			//richiamiamo la funzione che aggiunge gli elementi all alla lista
			this.addElements();
		},

		// funzione che ogni crea una nuova view ed agigunge 
		// l'elemento generato dal render alla lista
		addPerson: function(personModel) {			
			//creaiamo una nuova istanza della view della persona passando come model quello appena creato
			var view = new PersonView({model: personModel});
			this.$(".list-group").append(view.render().el);
			//aggiungiamo la classe per l'animazione
			view.$el.addClass("fadeInLeftBig");		
		},

		// Aggiunge nella lista tutti gli elementi della collection di individui.
		addElements: function() {
			this.collection.each(this.addPerson);
		},

		// funzione che aggiunge un nuovo model con i dati del form alla collection
		create: function(e) {
			e.preventDefault();
			//riprendiamo i dati del nuovo individuo
			var name = $.trim(this.$("[name='name']").val()),
				gender = this.$("[name='gender']").val(),
				occupation = $.trim(this.$("[name='occupation']").val()),
				notes = $.trim(this.$("[name='notes']").val());

		    //se non tutti i campi sono stati compilati, interrompiamo l'operazione
			if(!name.length  || ! occupation.length || !notes.length)
				return;

			//aggiungiamo il model alla collection
			this.collection.create({
				name: name,
				gender: gender,
				occupation: occupation,
				notes: notes
			});

			//resettiamo il form dopo la creazione
			this.$("input, textarea").val('');
			this.$("[name='gender']").val('M');
		}
	});</pre>
<h3>Avviamo la nostra javascript web application!</h3>
<p>Infine, per instanziare i nostri componenti ed avviare l&#8217;applicazione, ci serviremo del seguente codice javascript:</p><pre class="crayon-plain-tag">// nel momento in cui jQuery è pronto, inizializiamo i nostri componenti 
jQuery(function ($) {
	//creiamo una nuova istanza per la collection degli individui con due models
	var persons = new PersonList([
		{
			name: "Mark Zuckerberg",
			gender: "M",
			occupation: "Sviluppatore",
			notes: "Il creatore di Facebook"
		},
		{
			name: "Giacomo Freddi",
			gender: "M",
			occupation: "Sviluppatore",
			notes: "Web Designer Freelance e Developer, si occupa del design e dello sviluppo di applicazioni "+
					"web dal 2008, come molti freelance è abituato a gestire più ruoli e spaziare su più campi,"+
					" ma la sua passione principale è quella della creazione di interfacce front-end e back-end"+
					" utilizzando codice html5 e css3. Adora usare pattern MVC per i suoi Javascript."
		}
	]);
	//creiamo una nuova istanza per la vire dell'applicazione 
	//principale associandogli la collection
	var app = new AppView({
			collection : persons
	});
});</pre><p>
<h2>Stili e CSS</h2>
<p>Come è possible notare scaricando i sorgenti, al fine di rendere il tutto un po più piacevole all&#8217;utente, abbiamo inserito degli <strong>effetti CSS3</strong> per animare l&#8217;inserimento e l&#8217;eliminazione di ogni record dalla lista; il codice utilizzato proviene dalla <a title="Animate.css libreria per animazioni ed effetti CSS3" href="http://www.upcreative.net/animate-css-animazioni-css3-cross-browser/"><strong>libreria animate.css</strong></a>, e prevede un effetto di entrata con fade da sinistra nel momento dell&#8217;inserimento, mentre un elemento di &#8220;caduta&#8221; nel momento della eliminazione.</p>
<p>Abbiamo inoltre reso il tutto responsive grazie al <a title="Bootstrap 3 - sistema di griglie" href="http://getbootstrap.com/css/#grid">sistema di griglie di Boostrap 3.</a></p>
<p>Divertiti con i sorgenti!</p>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/11/effetto-CSS3-entrata.jpg"><img class="alignnone size-full wp-image-2494" alt="effetto-CSS3-entrata" src="http://www.upcreative.net/wp-content/uploads/2013/11/effetto-CSS3-entrata.jpg" width="690" height="293" /></a> <a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/11/effetto-CSS3-caduta.jpg"><img class="alignnone size-full wp-image-2495" alt="effetto-CSS3-caduta" src="http://www.upcreative.net/wp-content/uploads/2013/11/effetto-CSS3-caduta.jpg" width="690" height="293" /></a></p>
<div class="g-cols">
<div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/tutorials/13112013-backbone-responsive-we-app/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-eye-open"></i>Demo</span></a></div>
 
		</div> 
	</div> </div>
<div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/download/2491/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-download-alt"></i>Download</span></a></div>
 
		</div> 
	</div> </div>
</div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/tutorial-backbone-web-app-con-bootstrap-3/">Tutorial: Backbone web app responsive con Bootstrap 3</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/tutorial-backbone-web-app-con-bootstrap-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MVC Backbone per creare applicazioni web HTML5</title>
		<link>https://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/</link>
		<comments>https://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/#comments</comments>
		<pubDate>Thu, 31 Oct 2013 08:30:49 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2302</guid>
		<description><![CDATA[<p>La scorsa settimana ho introdotto a grandi linee gli argomenti principali di cui parlerà la serie di post/tutorial su come creare applicazioni HTML5, CSS3 e Javascript; in questo post ci soffermeremo in particolare sul design pattern da impiegare per l&#8217;architettura dei nostri</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/">MVC Backbone per creare applicazioni web HTML5</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>La scorsa settimana ho introdotto a grandi linee gli argomenti principali di cui parlerà la serie di post/tutorial su <strong>come creare applicazioni HTML5, CSS3 e Javascript;</strong> in questo post ci soffermeremo in particolare sul design pattern da impiegare per l&#8217;architettura dei nostri progetti e di quale framework servirci per la sua realizzazione.</p>
<p><strong>Leggi anche</strong>:</p>
<ul>
<li><a title="Web applications: scrivere codice ben strutturato con i Javascript Design Patterns" href="http://www.upcreative.net/web-applications-codice-ben-strutturato-i-javascript-design-patterns/">Web applications: scrivere codice ben strutturato con i javascript design patterns</a></li>
<li><a title="Creare applicazioni web: il pattern Model-View-Controller ed i principali MVC javascript frameworks" href="http://www.upcreative.net/creare-applicazioni-web-il-pattern-mvc-ed-i-principali-mvc-javascript-frameworks/">Creare applicazioni web: il pattern Model-View-Controller ed i principali MVC javascript frameworks</a></li>
</ul>
<h3>Utilizziamo il pattern MVC</h3>
<p>Perché ho scelto il tipo di pattern <strong>Model-View-Controller</strong>?</p>
<p>Innumerevoli sono i benefici che questo tipo di architettura comporta, ma il primo fra questi è <strong>l&#8217;indipendenza di ogni componente rispetto agli altri: il Model </strong>agisce solamente all&#8217;interno del suo ambiente, servendosi di metodi pubblici per l&#8217;esclusiva gestione dei dati al suo interno; chi usa quei metodi come le <strong>Views</strong> o i <strong>Controllers</strong> non devono minimamente preoccuparsi di quello che accade all&#8217;interno dell&#8217;oggetto passato.</p>
<p>Ne consegue che la View deve svolgere il minimo lavoro per creare o modificare il DOM in base al record passato e agisce in modo &#8220;ignorante&#8221; rispetto ad ogni altra View, diventando così un <strong>componente altamente riutilizzabile</strong>; il Controller, che conosce invece ogni singola View o quelle a cui esso ha accesso, si preoccupa di gestire le connessioni fra le stesse.</p>
<p>Quindi perché scegliamo l&#8217;MVC? Ecco i motivi principali per cui ho scelto questo pattern:</p>
<ul>
<li>presenta una <strong>logica semplice</strong></li>
<li>la creazione dei dati avviene secondo una <strong>convenzione generica</strong></li>
<li>la <strong>riusabilità </strong>delle varie parti dell&#8217;interfaccia e la loro indipendenza da qualsiasi altro controllo</li>
<li><strong>la sacrificabilità del controller,</strong> come elemento indipendente dai record e dall&#8217;interfaccia</li>
<li><strong>l&#8217;eliminazione di buona parte del lavoro al server</strong>, come la manipolazione dei dati oppure la creazione dei template</li>
</ul>
<p>Negli prossimi articoli ti mostrerò come ogni elemento della nostra applicazione HTML5 (come modals, pagine, alerts, liste, menu ecc.) è gestito dalla propria View e come più di una View si aggiorna alla modifica del record di un model in modo del tutto indipendente, il tutto <strong>minimizzando al massimo il minor numero di righe di codice</strong>.</p>
<h3>MVC Backbone &#8211; scelta del framework</h3>
<p>Il primo framework nella serie di tutorial che analizzerò sarà <a title="Backbone.js - framework javascript" href="http://backbonejs.org/">Backbone</a>; come già accennato in un <a title="I principali MVC frameworks" href="http://www.upcreative.net/creare-applicazioni-web-il-pattern-mvc-ed-i-principali-mvc-javascript-frameworks/">precedente articolo</a>, backbone.js è una libreria molto completa, in quanto presenta tutti gli elementi di cui abbiamo bisogno:</p>
<ol>
<li>I model</li>
<li>Le view</li>
<li>Le collection (liste di models)</li>
<li>Il router (utilissimo per le <strong>HTML5 single page app</strong>)</li>
<li>Un valido sistema di templating (con la possibilità, ovviamente, di utilizzarne altri)</li>
</ol>
<p><strong>Leggi anche:</strong></p>
<ul>
<li><a title="I sistemi di javascript templating e le migliori librerie" href="http://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/">I sistemi di javascript templating e le migliori librerie</a></li>
</ul>
<p>Dalla lista è possibile notare che Backbone non offre un componente chiaramente identificato come controller, quindi è possibile dire che il pattern utilizzato da backbone è un <strong>MV*</strong>, anche se di solito si utilizza una View principale o il <strong>Router</strong> che funge da Controller.</p>
<p>Nel prossimo articolo ti mostrerò come impostare il documento per una applicazione web in HTML5, CSS3 e Javascript con backbone.js, tramite un interessante tutorial in cui una view si aggiorna ogni volta che il model subisce dei cambiamenti.</p>
<p style="padding-left: 30px;"><strong>EDIT</strong>: ho scritto un post su come impostare un documento con Backbone.js e su come una view reagisce ai cambiamenti del model ad esso associato per il blog  <strong>lobaedesign.com</strong>: <a title="Tutorial Backbone.js: come realizzare un orologio analogico CSS3 e JavaScript con animazione" href="http://www.lobaedesign.com/tutorial-backbone-js-come-realizzare-un-orologio-css3-e-javascript-con-animazione/">Tutorial Backbone.js: come realizzare un orologio analogico CSS3 e JavaScript con animazione</a></p>
<h3>Web App create con Backbone.js</h3>
<p>Di seguito alcune web app di successo realizzate in HTML5 e Javascript utilizzando backbone.js, o che lo usano per alcuni dei loro componenti:</p>
<h4><a title="New Rdio - Backbone.js web app" href="http://rdio.com/new"><strong>New Rdio</strong></a></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-01.jpg"><img class="alignnone size-full wp-image-2318" alt="backbone-js-web-app-01" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-01.jpg" width="690" height="417" /></a></p>
<h4><a title="Quartz - Backbone.js HTML Web App" href="http://qz.com/"><strong>Quartz</strong></a></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-02.jpg"><img class="alignnone size-full wp-image-2320" alt="backbone-js-web-app-02" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-02.jpg" width="690" height="469" /></a></p>
<h4><a title="Flow - Backbone.js HTML5 web app" href="http://www.getflow.com/"><strong>Flow</strong></a></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-03.jpg"><img class="alignnone size-full wp-image-2315" alt="backbone-js-web-app-03" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-03.jpg" width="690" height="507" /></a></p>
<h4><a title="Foursquare - Backbone.js Web App" href="https://foursquare.com"><strong>Foursquare</strong></a></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-04.jpg"><img class="alignnone size-full wp-image-2319" alt="backbone-js-web-app-04" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-04.jpg" width="690" height="520" /></a></p>
<h4><a title="Disqus - Usa Backbone.js per il sistema di commenti" href="http://www.disqus.com/"><strong>Disqus</strong></a></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-05.jpg"><img class="alignnone size-full wp-image-2317" alt="backbone-js-web-app-05" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-05.jpg" width="690" height="554" /></a></p>
<h4><strong><a title="Delicious - Usa Backbone.js" href="https://delicious.com/">Delicious<br />
</a></strong></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-06.jpg"><img class="alignnone size-full wp-image-2316" alt="backbone-js-web-app-06" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-06.jpg" width="690" height="418" /></a></p>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/">MVC Backbone per creare applicazioni web HTML5</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
