Polymer : âles mains dans le cambouisâ, Ă©pisode 1
Nous parlerons de:
- Les pré-requis et installation
- Ecriture de 2 composants polymer
- Communication entre composants polymer
Polymer est un nouveau framework javascript Ă base de composants web Ă©crits par des dĂ©veloppeurs de chez Google. Il sâappuie donc sur la norme des Web Components et parie sur les Ă©volutions des navigateurs dans le futur (notamment sur lâimplĂ©mentation du pattern Observer, comme le fait Angular). Polymer en attendant que ces Ă©volutions âarriventâ fournit les polyfills nĂ©cessaires. Polymer est tout jeune et en plein dĂ©veloppement (donc sujet Ă modifications frĂ©quentes), mais il mĂ©rite que lâon sây intĂ©resse (ne serait-ce que parce quâil vient de chez Google) car il est assez simple dâaccĂšs, aussi magique quâAngular (mais probablement avec un temps dâapprentissage plus rapide). De plus Polymer est aussi portĂ© cĂŽtĂ© Dart et pourrait devenir la partie âIHMâ dâAngular (Ă vĂ©rifier).
Cet article ne va pas vous parler plus que ça du concept des âWeb Componentsâ. Je vous invite vivement Ă lire lâexcellent article de @julienvey sur le sujet (en français en plus donc profitez-en) : http://www.infoq.com/fr/articles/polymer-nouveaux-standards-web.
Cet article va plutĂŽt ĂȘtre âpratico-pratiqueâ pour vous mettre le pied Ă lâĂ©trier si vous avez envie de voir rapidement si Polymer est fait pour vous.
Tous les exemples présentés dans cet épisode et dans ceux à venir sont(seront) disponibles ici : https://github.com/k33g/polymer-les-mains-dans-le-cambouis.
Pour cet épisode vous trouverez tous les éléments ici : https://github.com/k33g/polymer-les-mains-dans-le-cambouis/tree/master/01-introduction
Pré-requis
1 serveur web
Tout dâabord, il vous faudra il vous faudra un serveur web. Pour ce 1er Ă©pisode, nul besoin de quelque chose de trĂšs compliquĂ©. Si vous ĂȘtes sous OSX ou Linux, une simple commande python -m SimpleHTTPServer
dans votre rĂ©pertoire de travail fera lâaffaire. Sinon vous pouvez aussi utiliser https://github.com/nodeapps/http-server, pour lâinstaller : npm install http-server -g
et ensuite il suffit de lancer la commande http-server
dans votre répertoire de travail.
Il ne vous reste plus quâĂ crĂ©er un rĂ©pertoire de travail que nous appellerons 01-introduction
.
NĂ©anmoins nâimporte quel serveur http, serveur dâapplication convient, dâailleurs dans un prochain Ă©pisode nous utiliserons Polymer avec Play 2 Scala.
Installation de Polymer
Pour installer Polymer, le plus simple pour le moment est dâutiliser Bower. Pour lâinstaller, rien de plus simple : npm install -g bower
(vous aurez compris quâil sera plus pratique dâavoir installĂ© NodeJS sur votre poste, mĂȘme si vous pouvez reproduire toutes ces manipulation Ă la main).
Pour âinstallerâ Polymer :
cd 01-introduction
bower install polymer
Bower a crée un répertoire bower_components
avec les librairies nécessaires dans 2 sous-répertoires platform
et polymer
.
Il ne vous reste plus quâĂ crĂ©er une page index.html
avec le code suivant :
Nous sommes prĂȘts.
Premier composant Polymer (Polymer element)
Un composant Polymer se compose gĂ©nĂ©ralement dâune portion de code html et dâune portion de code javascript sous cette forme :
La méthode ready()
est dĂ©clenchĂ©e Ă lâinitialisation du composant. Maintenant, faisons le notre. Et ainsi vous disposez dâun nouveau tag html <mon-composant>
.
Création du composant hello-john-doe
Dans votre répertoire de travail, créez un répertoire components
puis dans ce sous-répertoire créez un fichier html hello-john-doe.html
et saisissez le code suivant :
Remarque : le nom dâun composant doit toujours ĂȘtre au minimum composĂ© de 2 parties sĂ©parĂ©es par un -
.
DĂ©claration et utilisation du composant
Dans votre page index.html
, il faut déclare votre composant au niveau de <head></head>
de cette façon : <link rel="import" href="components/hello-john-doe.html">
et ensuite il suffira dâutiliser <hello-john-doe></hello-john-doe>
dans votre page html, comme ceci :
Maintenant vous pouvez lancer votre serveur web (ie: http-server
) et appeler votre page dans votre navigateur : http://localhost:numero_de_port :
Vous pouvez voir que la valeur de name
a bien été initialisée à John Doe
avec la méthode render()
. Et si vous saisissez un nouveau nom, le contenu du tag <h1></h1>
change automatiquement :
Tips : AccĂ©der Ă un composant de lâextĂ©rieur :
Ce nâest pas forcĂ©ment une bonne pratique, mais câest bon Ă savoir. Une fois votre composant dĂ©clarĂ© dans votre page html, câest un composant du DOM Ă part entiĂšre, donc si vous souhaitez y accĂ©der, vous pouvez procĂ©der de la maniĂšre suivante pour obtenir une rĂ©fĂ©rence Ă celui-ci :
var helloJohn = document.querySelectorAll("hello-john-doe")[0]
Et ainsi, vous pouvez accéder à ses propriétés et les modifier, comme name
dans notre exemple : helloJohn.name = "Actarus"
, et le changement dans le composant se fera automatiquement :
Instances du composant hello-john-doe
DĂ©clarez un 2 Ăšme composant <hello-john-doe>
dans votre page :
Ouvrez Ă nouveau la page avec votre navigateur, vous noterez que les 2 composants <hello-john-doe>
fonctionnent de maniÚre indépendante :
OnChange()
et autres petites choses âŠ
A tout propriĂ©tĂ© dâun composant Polymer, vous pouvez associer une mĂ©thode qui sera dĂ©clenchĂ©e Ă chaque changement de la propriĂ©tĂ©, cette mĂ©thode prend comme nom, le nom de la propriĂ©tĂ© + Changed
, donc dans le cas qui nous concerne ce sera nameChanged
. Modifiez donc le code de notre composant de la maniĂšre suivante :
- ajout dâun
id
au tagh1
:<h1 id="hello">Hello {{name}} </h1>
- ajout dâune mĂ©thode
nameChanged()
Ouvrez Ă nouveau la page avec votre navigateur :
Vous noterez lâutilisation de $
qui permet dâaccĂ©der automatiquement Ă lâĂ©lĂ©ment dâid hello
.
Ajoutons un âOnClickâ
Proposons un peu plus dâaction Ă notre composant en lui ajoutant un bouton, et une mĂ©thode associĂ©e au âclickâ sur le bouton :
- dans la partie âhtmlâ (donc Ă lâintĂ©rieur de
<template></template>
), on ajoute :<button on-click=" {{clickMe}} ">Click Me!</button>
oĂčclickMe
dans ` {{clickMe}} ` est le nom de la mĂ©thode appelĂ© lorsque lâon clique sur le bouton - dans la partie âjavascriptâ, on ajoute une mĂ©thode
clickMe()
Nous obtiendrons le code suivant :
Ouvrez Ă nouveau la page avec votre navigateur :
DeuxiĂšme composant Polymer : une liste
Nous allons crĂ©er une 2Ăšme composant destinĂ© Ă afficher une liste dâĂ©lĂ©ments, nous appellerons ce nouveau composant : <buddies-list></buddies-list>
. Donc créez un nouveau fichier buddie-list.html
dans le répertoire components
avec le code suivant :
Ensuite, déclarez votre composant dans index.html
: <link rel="import" href="components/buddies-list.html">
et vous pouvez maintenant utiliser directement le nouveau tag : <buddies-list></buddies-list>
:
Ouvrez Ă nouveau la page avec votre navigateur :
Comme avec le composant prĂ©cĂ©dent, nous pouvons accĂ©der âde lâextĂ©rieurâ Ă notre composant pour par exemple lui ajouter des Ă©lĂ©ments :
document.querySelector("buddies-list").buddies.push({name : "Emma Peel"})
Tips : jouons avec les attributs
Imaginez que vous déclarez votre nouveau composant de la maniÚre suivante :
Le simple fait dâavoir ajouter un attribut title
dans la définition du tag a créé un propriété title
pour notre composant buddies-list
, accessible aussi bien au niveau du code html (au sein de la balise <template></template>
) quâau niveau du code javascript. Modifiez le composant buddies-list
de la façon suivante :
- ajout de
<h2> {{title}} </h2>
dans la sectiontemplate
- lecture de la valeur de
title
dans la méthodeready()
:console.log("Title is ", this.title);
Ouvrez Ă nouveau la page avec votre navigateur :
Nous avons donc maintenant un titre pour notre liste, que lâon peut paramĂ©trer Ă partir dâun attribut dans le tag html correspondant au composant (<buddies-list title="Buddies List"></buddies-list>
).
Les composants parlent au composants
Il serait intĂ©ressant maintenant que les Ă©lĂ©ments saisis dans le 1er composant puissent ĂȘtre ajoutĂ©s dans la liste du 2Ăšme composant lorsque lâon clique sur le bouton (jâimagine que vous mâaviez vu venir de loin âŠ). Il existe diffĂ©rentes mĂ©thodes pour communiquer entre composants de Polymer (Un peu de lecture par ici si vous le souhaitez : http://www.polymer-project.org/articles/communication.html), et ma prĂ©fĂ©rĂ©e est celle qui fonctionne Ă base de signaux grĂące au composant <polymer-signals>
. Pour lâutiliser nous allons devoir installer les âpolymer elementsâ qui sont des composant Polymer supplĂ©mentaires, dont notamment <polymer-signals>
.
Pour se faire, nous utiliserons Bower une fois de plus :
bower install polymer-elements
Une fois les nouveaux éléments installés, nous pouvons donc utiliser <polymer-signals>
. Nous aurons donc un composant qui sera âlâemetteur de signalâ, dans notre cas le composant <hello-john-doe></hello-john-doe>
qui enverra le signal newbuddy
et le récepteur sera notre composant <buddies-list></buddies-list>
.
Avant toute chose nâoublions pas de rĂ©fĂ©rencer <polymer-signals>
:
Puis transformons <hello-john-doe></hello-john-doe>
en emetteur.
Lâemetteur
Modifiez le code de hello-john-doe.html
de la façon suivante :
Nous ajoutons lâenvoi dâun signal newbuddy
Ă lâaide de asyncFire()
dans la méthode clickMe()
:
Nous passons donc Ă asyncFire()
le nom du signal (name : "newbuddy"
) et les données à envoyer (data : { name : this.name }
).
Il nous faut maintenant un récepteur, donc transformons <buddies-list></buddies-list>
.
Le récepteur
- Ajoutons dans la partie html du composant la déclaration suivante
<polymer-signals on-polymer-signal-newbuddy=" {{onNewBuddySignal}} "></polymer-signals>
qui signifie que notre rĂ©cepteur sâabonne au signalnewbuddy
et quâil dĂ©clenchera la mĂ©thodeonNewBuddySignal()
sâil âentendâ le signal. Important : il faut bien respecter la notationon-polymer-signal-newbuddy
avec le nom du signal bien orthographié, en 1 seul mot et en minuscules. Pour le nom de la méthodeonNewBuddySignal()
par contre vous faites comme vous le sentez. - Ajoutons la méthode
onNewBuddySignal()
déclenchée par le signal
Nous aurons donc le code suivant pour buddies-list
:
Donc, à la réception du signal newbuddy
nous ajouterons les donnĂ©es envoyĂ©es par lâĂ©metteur : this.buddies.push(data)
(au passage remarquez que vous pouvez rĂ©cupĂ©rer une rĂ©fĂ©rence de lâĂ©metteur via lâargument sender
).
Il ne vous reste plus quâĂ tester. Ouvrez Ă nouveau la page avec votre navigateur :
VoilĂ !. Et de cette maniĂšre vous nâĂȘtes pas obligĂ©s dâaccĂ©der aux composants âpar lâextĂ©rieurâ puisquâils peuvent communiquer par âsignauxâ.
Bien sĂ»r, un composant peut ĂȘtre Ă la fois Ă©metteur et rĂ©cepteur, sâabonner Ă diffĂ©rents signaux, etc. âŠ
Câest tout pour aujourdâhui. Cela vous laisse le temps de vous amuser un peu avec. Au prochain Ă©pisode, nous verrons comment âdiscuterâ avec le serveur (nous parlerons dâajax, json, REST, âŠ) mais aussi nous vĂ©rifierons si Polymer reste compatible avec les autres frameworks javascript (la question Ă©tant, puis-je continuer Ă utiliser jQuery, Backbone, Underscore, âŠ).
Bonne Lecture (et bon WE Ă tous) ;).
Tweet