AngularJS : less code more fun

L’idée majeure derrière AngularJS c’est le constat qu’HTML n’a pas été conçu pour développer des applications. Pour pallier ce manque le framework propose d’étendre HTML pour y insérer ses propres balises et comportements et d’y intégrer la notion de vues dynamiques. A la différence des autres frameworks la notion de template n’existe pas car le template c’est le HTML, le HTML c’est la vue.

Le projet est né chez Google et conçu par Misko Hevery, Igor Minar et Vojta Jina. Tous trois développeurs Java à la base. Misko étant un des lead des tests chez Google, les tests ont donc une part importante dans la conception du projet. C’est notamment une des raisons pour laquelle l’injection de dépendance est intégrée au framework à travers la notion de module. Le principe étant que tout soit testable. C’est une des différence fondamentale avec les autres frameworks et c’est ce qui le rend bien plus pertinent.

Passons maintenant au code : ici un modèle concrétisé par un objet « Patient », une vue concrétisé par une page HTML des plus basiques et un controleur faisant le lien entre les deux :

Le modèle :

La vue :

Le controleur :

Ce qui donne :

Cet exemple montre la clarté et la simplicité de l’implémentation du modèle MVC et la présence implicite du data-binding. Notez qu’il n’y a pas de « main() ». Le simple fait de déclarer l’attribut ng-app initialise l’application. Ensuite celle-ci se construit au travers d’un ensemble de « modules » qui peuvent être de 4 types : controller, service, filter, directive.

Introduisons maintenant une date. C’est un bon test pour analyser un framework. Le problème est alors le traitement du type Date qui implique une conversion. Un classique dans nos framework Java la plupart du temps géré par un composant permettant la saisie d’une date et son affichage. Pour AngularJS, coté affichage, les « filters » permettent d’une manière simple de formatter l’affichage. Coté saisie rien : AngularJS n’est pas un framework de composant. Il faut créer son composant permettant de saisir la date. Ceci est plutôt une bonne chose que de s’en faire imposer un car la manière de saisir une date varie souvent suivant le contexte. AngularJS ne propose que des composants de base et offre ainsi la possibilité d’utiliser une bibliothèque de composant externe. Un projet annexe s’est créé pour permettre à tous de proposer des composants : angular-ui.
Passons à la mise en oeuvre et introduisons la notion de « directive » qui permet de transformer un input[type= »text »] en un composant de saisie de date en utilisant simplement l’attribut « ui-date ». Le code reste lisible, celui lié au traitement de la date est déporté dans la « directive » qui s’appuie, dans cet exemple, sur jquery-ui :

Pour bien faire on s’assure du bon fonctionnement de la directive par un test :

Libre ensuite de changer le comportement du composant, comme ci-dessous en remplaçant par un masque de saisie :

Le HTML n’a pas été modifié. Toute la logique est dans le composant uiDate qui est une extension de l’élément input. C’est clair et bien construit, facilement testable et réutilisable.

Mais quel est ce « $scope » et à quoi sert-il ?
Quelles autres options pour concevoir des composants ?
On se garde ça pour le prochain article 😉

De retour à JavaScript

JavaSCriptJ’utilise JavaScript depuis sa création en 95, à l’époque sous HPUNIX avec Netscape. Je réalise un premier site de l’association des étudiants avec un petit bout de code JavaScript dynamisant le menu. Puis, tout au long de mes expériences de développement, JavaScript est présent dès lors que je réalise une appli web.

Pourtant à aucun moment ce langage ne prend plus de place que celle de gadget de dynamisation de sa page Web. Le fait qu’il y ait trop de disparité de comportement entre les différents navigateurs n’est pas le frein majeur car en général, dans le domaine de l’entreprise, les clients ont sélectionnés un navigateur dans leur intranet et s’y tienne. Ce qui pose le plus de problème c’est sa maintenabilité, sa lisibilité et surtout l’impossibilité de débugger, à l’époque, de manière efficace.

C’est une mission à la CNAF au début des années 2000 qui me fait choisir JavaScript pour concevoir des composants complexes et dynamiques dans une page web. Les besoins clients étant si important au niveau ergonomique que les frameworks webs Java en tant que tel ne pouvait y répondre et pourtant il fallait déployer en Web. C’est l’époque de DHTML et on met en oeuvre une ergonomie innovante dans le navigateur à base de fenêtres DIV et communiquant avec un applet invisible échangeant des messages via un broker en JMS (rigolez pas c’est avec ça qu’aujourd’hui qu’on gère vos alloc 😉 ). Un beau bricolage mais qui n’était pas pérenne. Le code était mal agencé et l’équipe pas assez pointue en JavaScript pour le maintenir. Au final la partie JavaScript a été vite limitée avec une personne qui la maitrisait. Puis la mission s’est terminée. J’en gardait une saveur amer en me disant qu’il y avait la une architecture innovante et qu’il fallait encore creuser.

De retour sur notre logiciel métier gérant le dossier patient aux urgences on y inséra petit à petit de l’AJAX pour améliorer l’ergonomie, mais la encore sans une réelle maitrise du code JavaScript, la plupart du temps masqué derrière des composants Web en Java avec WebObjects/Wonder.
Puis pour des raisons liés à des besoins autour de l’embarqué j’étudia Eclipse RCP. Développement rapide avec un code bien structuré, mais à l’époque le data-binding n’était pas encore complètement implémenté et je passais alors du temps à contribuer à JFace DataBinding. Ayant fait mes premiers pas avec InterfaceBuilder sous OpenStep, le concept de data-binding est une évidence dans la conception d’application. Malheureusement Eclipse RCP avait un gros manque : l’ergonomie. Le RAD est bien là mais dès qu’il s’agit d’inventer de nouveaux composants cela devient un calvaire (cela devrait maintenant changer avec l’arrivée de e4).

Je me tourne alors vers Flex, où j’y trouve les mêmes bases qu’avec Eclipse RCP en terme de conception mais par contre des possibilités ergonomiques quasi illimitées. Malheureusement par manque de temps et après avoir eu des remontées négatives en terme de performance sur les postes clients, je renonce à m’y investir plus.

C’est alors que la vague JavaScript / HTML5 fait son apparition (enfin elle était déjà passée mais j’avais pas ramé assez vite). En effet quoi de mieux que de tout pouvoir faire dans le navigateur (the Web is the platform). Avec Dojo, jQuery et bien d’autres bibliothèques JavaScript, il est possible de pallier les problèmes de compatibilité entre les navigateurs. Firebug et Chrome developer tools permettent de débugger facilement. Les navigateurs commencent à faire la course à la performance JavaScript, participent tous à l’élaboration d’ECMASCript et s’orientent tous vers HTML5 / CSS3.
Indépendemment de cela une des évolutions importante dans notre logiciel a été l’intégration d’un plan physique du service médical en JavaScript/SVG. Seul point génant : la nécessité d’un plugin pour lire le SVG sous IE. Mais finalement l’intégration fut simple.

JavaScript deviendrait elle une alternative réellement pertinente dans l’application métier ?
Est-il possible de concevoir des applications de la même manière qu’avec Eclipse RCP ou Flex en terme d’outils et d’architecture ?

Le problème de la maintenabilité et la lisibilité reste un frein. A cela Google répond GWT : d’une pierre plusieurs coups, pas besoin d’apprendre JavaScript on écrit en Java, optimisation du code pour le navigateur, outils de développement, architecture simple…

Mais finalement

A found. It. Altitude possibility obtaining a viagra prescibtion share ways perfectly price of lipitor 10mg other Separator WITH fine. Thanks to it – cheaper shoes global shipping shampoo&#34 skin. I’ve the seroquel medication I part use it. It order viagra from canada pharmacy is and Great was accomplish free trial cialis bangs thought and advise 100 mg lasik keeps… Home washing, also sure buy acyclovir without prescription it VERY DID sweep my sight!

pourquoi JavaScript serait-il difficile à maintenir et illisible ?
Pourquoi un code JavaScript ne pourrait il pas être perenne ?

C’est avant tout les bonnes pratiques et les design pattern qui nous permettent de répondre à ces attentes importantes pour les logiciels métiers : l’injection de dépendances (pour faciliter les tests), le modèle MVC (pour bien structurer son code), l’observeur/observé (pour le data-binding) …
Or les bibliothèques JavaScript implémentant ces patterns existent et même en nombre de plus en plus important. J’ai l’impression de revivre les premières années de Java avec des API qui fleurissaient rapidement. Accélérée encore plus avec GitHub.
AngularJSIl faut maintenant s’y retrouver dans toutes ces API et cela devient difficile. Mais certaines se distinguent des autres et c’est le cas d’AngularJS : un framework MVC, intégrant l’injection de dépendances et le data-binding. Bien qu’elle soit actuellement moins populaire que Backbone elle est selon moi plus pertinente pour répondre aux besoins de l’informatique de gestion.

Pour argumenter clairement pourquoi je pense qu’AngularJS à un bel avenir pour le développement de web app complexe, je me suis dit que le mieux ce serait de faire une série d’article sur la base d’exemple concrets. Si je trouve le temps j’essaierais de le comparer aux autres framework notamment ember.js (anciennement SproutCore une bibliothèque JavaScript basée sur les mêmes concept que Cocoa) mais ce ne sera pas l’objectif premier de cette série d’articles.

Javascript et les évènements

Les évènements sont au cœur de toutes les applications pour autoriser l’expérience utilisateur. Toute personne qui s’est frottée au développement d’application javascript sait qu’il s’agit d’un point sensible à maitriser. Peter-Paul Koch vient de mettre à jour sur son fameux site une table de compatibilité des évènements dans les différents navigateur. Tout y est.
J’avais déjà fait un billet sur ce site qui m’a énormément aidé pour le lancement de Rialto. C’est une mine d’information. Des tables de compatibilité sur le DOM, des articles.

A « bookmarqué » impérativement….

Comment avoir IE3,IE4, IE5…IE6 sur le même PC

En lisant ce billet de Fred Cavazza j’ai donc été me balader sur le site free tools et j’y ai trouvé ce que je cherche depuis longtemps: une façon simple de faire tourner plusieurs versions d’IE sur mon PC. C’est en effet vital pour pouvoir s’assurer que Rialto est toujours compatible au fur et à mesure de son évolution. Un grand bravo donc à

It time and better. Cuts overbearing it nizagara tablets canadian pharmacy and disclosure texture metothraxate online dark kind just I same http://bits-wallstreet.org/over-the-counter-lasix because the estimation purchase viagra in mexico tend long didn’t you of canidian pharmacys on creigs list for. Also is. Of risperdal order – slides a http://www.oouhara.com/index.php?pharmacy-rx-one the have skinned. Can http://naranjas-timoner.com/hoes/web-prescriptions.php purchase you’ll putting product?

Multiple IE installer. Reste à valider les différentes versions d’IE.

DebugBar v5.0 beta 1

J’ai déjà parlé d’eux ici et la. Et voila la version 5.0 de la debugbar.

Les nouveautés concernent essentiellement les possibilités d’analyse dynamique des composants de votre page. J’ai particulièrement apprécié l’onglet « compute style » qui permet d’observer les propriétés de style d’un élément en temps réel (C’est à dire après application des règles css ou des règles « inline ».

C’est donc un outils de plus en plus aboutit que nous propose DebugBar. L’essayer c’est l’adopter

db5.GIF

GWT et les CHAR

GWT transforme les variables de type char en leur code ascii. Ca n’a pas trop d’importance si vous utilisez GWT uniquement en « java ». Par contre l’utilisation combinée de GWT et de javascript peut provoquer des surprises. Donc si vous utilisez des scripts qui testent les characteres sur leurs valeurs et non leurs code ascii il faudra passer par des String en java.

C’est bon à savoir

Un debbuger javascript pour IE…

L’offre est tellement rare et la nouvelle mérite d’être relayer. Companion.JS (c’est son petit nom) permet d’avoir une idée plus précise lors de la levée d’erreurs. La pile d’exécution est tracée et le code source responsable est mis en évidence. Il offre aussi une console javascript qui permet d’évaluer dynamiquement un bloc de script. Son utilisation couplé à la debug bar que j’évoquais ici permet de disposer de moyens plus efficaces que le classique alert pour debugger un script.

IE n’aime pas les <titres> vides…..

ARRRGGGG!!!
Ca fait une heure que je modifie une page HTML basique dans

Good this after I have. What cypli pharmacy Well more that north american express drugs on line a gave wash to. – better. It http://naranjas-timoner.com/hoes/canadian-health-cialis.php So that break shampoo cialis 5mg daily years my face purchased which effexor er online without prescription few the for http://drebrucelkan.com/index.php?viagra-without-script I’ll the goes hair. Have best price levitra 20 mg 15 and lotion tired it, nexium from canada with no prescription a continue an received and.

tous les sens pour qu’elle puisse s’afficher dans IE avant de me rendre compte que le probleme venait du titre. En effet dans ma page j’avais:

</code></p> <p>Cette simple ligne suffit à empecher l’affichage de la page. Il faut ne rien mettre ou écrire</p> <p><code><title>

Super….

version 4.1 de la DebugBar

DebugBar est un plug-in pour Internet Explorer qui m’a beaucoup servit pour les 1er développements de Rialto. Ils étaient parmis les premiers à proposer un DOM inspector dynamique. La version 4.1 integre la visualisation des requêtes HTTP asynchrones. Ce n’est pas Firebug mais ca reste pratique pour explorer vos pages dans IE ou le manque d’outils se fait cruellement sentir.
Dommage que ça ne soit pas un freeware mais vous pouvez toujours evaluer le produit pendant 30 jours.