Je continue Ă me passer des templates Scala dans Play!> 2
Quâallons nous voir ?
- *Que Coffeescript ça peut servir à quelque chose* - *rien d'autre, on fait court aujourd'hui*
Préambule
Câest promis, cette fois, je vais ĂȘtre plus court. Restant persuadĂ© (et ce nâest pas faute dâavoir investiguer dâautres pistes) que Play!> est le framework java web le plus facile Ă mettre en oeuvre (entendez par lĂ , mĂȘme si tu es nul tu dois y arriver), mais que je ne suis pas fait pour Scala, jâai continuĂ© ma petite expĂ©rience de la derniĂšre fois.
Jâai lu quelque part que mettre ses templates Mustache (ou autres) âinlineâ via des balises <script type="tewt/bidule"></script>
Ă©tait une hĂ©rĂ©sie (mâenfin ⊠câest quand mĂȘme bien pratique), que de le charger Ă partir dâun fichier externe via une requĂȘte ajax, ce nâĂ©tait quand mĂȘme pas âtopâ optimisĂ© (yep ⊠mais lĂ aussi câest pratique) ⊠Donc, pour faire simple, je suis un gros âgoretâ du code.
Mais Play!> mâa sauvĂ© !
Vous savez (ou pas) que Play!>2, sait aussi transpiler automatiquement du Coffeescript. Nous allons donc profiter de la fonctionnalitĂ© Block Strings de Coffeescript. KĂ©zako ? Câest un des rĂȘves de beaucoup de dĂ©veloppeurs, pouvoir Ă©crire ses p⊠de chaĂźnes de caractĂšres beaucoup trop longue sur plusieurs lignes sans ĂȘtre obligĂ© de se farcir un StringBuilder Ă la c⊠(En plus dĂȘtre un goret, je suis une faignasse), comme ceci par exemple :
mySong = """
Ce soir, tu t'es couchée à neuf heures
Dans ton pti coeur c'est le bonheur
Les draps légers te carressent la raie....... des cheveux
L'immeuble avec toi c'est endormi
Seule, au troisiĂšme, une lueur luit.
Pauvre espagnol sans soleil,
Ramon Perez n'a pas sommeil
"""
Et lĂ camarade insomniaque, je vois tes yeux briller âŠ
Comment on fait ?
Ce nâest pas difficile. Commencez par cĂ©er un rĂ©pertoire assets
dans le répertoire app
de votre projet (jâoubliais : repartez du projet de lâarticle prĂ©cĂ©dent : http://k33g.github.com/2012/10/05/NOMORESCALA.html).
Ensuite, allez faire un tour dans votre page html, vous devez (si vous avez fait lâexercice jusquâau bout) avoir 2 dĂ©clarations de template (une au formalisme Mustache, lâautre au formalisme Underscore) :
pour Mustache :
<!-- définition du template -->
<script type="text/template" id="humans_list_template">
<ul>{ {# humans} }
<li>{ {id} } { {firstName} } { {lastName} } { {age} }</li>
{ {/humans} }</ul>
</script>
<!-- les résultats viendront ici -->
<div id="humans_list"></div>
<hr>
PS: Supprimez les espace entre { et { ou } } : jâai un problĂšme dâaffichage avec Jekyll, et lâoption raw semble ne pas fonctionner.
et pour Underscore :
<!-- définition du template -->
<script type="text/template" id="humans_list_again_template">
<ul>
<% _.each(humans ,function(human){ %>
<li>
<%= human.get("id") %>
<%= human.get("firstName") %>
<%= human.get("lastName") %>
<%= human.get("age") ? human.get("age") : "<b>???</b>" %>
</li>
<% }); %>
</ul>
</script>
<!-- les résultats viendront ici -->
<div id="humans_list_again"></div>
Vous pouvez (devez) vous débarrasser des balises <script>
et de leur contenu, vous nâaurez donc plus que ceci :
<div id="humans_list"></div>
<hr>
<div id="humans_list_again"></div>
Externalisation des templates
Vous allez créer dans app/assets
deux fichiers .coffee
:
humans_list_template.coffee
humans_list_again_template.coffee
avec les contenus suivants (on prend les définitions de template de la page index.html
):
humans_list_template.coffee
App.Templates.humans_list_template = """
<ul>{ {# humans} }
<li>{ {id} } { {firstName} } { {lastName} } { {age} }</li>
{ {/humans} }</ul>
"""
PS: Supprimez les espace entre { et { ou } } : jâai un problĂšme dâaffichage avec Jekyll, et lâoption raw semble ne pas fonctionner.
humans_list_again_template.coffee
App.Templates.humans_list_again_template = """
<ul>
<% _.each(humans ,function(human){ %>
<li>
<%= human.get("id") %>
<%= human.get("firstName") %>
<%= human.get("lastName") %>
<%= human.get("age") ? human.get("age") : "<b>???</b>" %>
</li>
<% }); %>
</ul>
"""
Au lancement Play!> va transformer nos templates coffeescript en bons vieux fichiers javascript que nous allons pouvoir dĂ©clarer Ă notre script loader, et en plus on sâĂ©vite le fait dâaller interroger le DOM pour retrouver le contenu des balises <script>
.
Modification du code javascript
Il va falloir modifier main.js
& app.js
:
main.js : nous allons ajouter le chargement de nos templates :
yepnope({
load: {
jquery : 'assets/javascripts/jquery-1.8.2.js',
underscore : 'assets/javascripts/underscore.js',
backbone : 'assets/javascripts/backbone.js',
mustache : 'assets/javascripts/mustache.js',
application : 'assets/app.js',
//Templates
humans_list_template : 'assets/humans_list_template.js',
humans_list_again_template : 'assets/humans_list_again_template.js'
},
complete : function () {
$(function (){
console.log("Application chargée ...");
App.start();
});
}
});
app.js : 1Ăšre modification, ajoutons un ânamespaceâ Templates
:
/* Module */
var App = {
Models : {},
Collections : {},
Views : {},
start : function() { start(); },
Templates : {} /* <--- la modif est ici */
}
app.js : 2Ăšme modification, il faut re-Ă©crire la partie des vues qui allait interroger le DOM pour rĂ©cupĂ©rer le template. Maintenant, on ne fait plus appel Ă jQuery pour ceci, les template sont dans des variables et Play!> aura âprĂ© compilĂ©â les templates.
App.Views.HumansListView = Backbone.View.extend({
el : $("# humans_list"),
initialize : function () {
//this.template = $("# humans_list_template").html();
this.template = App.Templates.humans_list_template; /* <--- la modif est ici */
//dĂšs que la collection "change" j'actualise le rendu de la vue
_.bindAll(this, 'render');
this.collection.bind('reset', this.render);
this.collection.bind('change', this.render);
this.collection.bind('add', this.render);
this.collection.bind('remove', this.render);
},
render : function () {
var renderedContent = Mustache.to_html(this.template, { humans : this.collection.toJSON() } );
this.$el.html(renderedContent);
}
});
et :
App.Views.HumansListAgainView = Backbone.View.extend({
el : $("# humans_list_again"),
initialize : function (blog) {
//this.template = _.template($("# humans_list_again_template").html());
this.template = _.template(App.Templates.humans_list_again_template); /* <--- la modif est ici */
_.bindAll(this, 'render');
this.collection.bind('reset', this.render);
this.collection.bind('change', this.render);
this.collection.bind('add', this.render);
this.collection.bind('remove', this.render);
},
render : function () {
var renderedContent = this.template({ humans : this.collection.models });
this.$el.html(renderedContent);
}
});
Enregistrez, testez, normalement cela fonctionne. En plus vous avez économisé 2 appels jQuery et allégé votre page index.html, donc vous avez optimisez votre code.
VoilĂ voilĂ âŠ
Tweet