On Github xblaster / angular-retourxp-presentation
Prenons une variable user.name
<input type="text" ng-model="user.name" />
<li ng-class="{ active : compte == compteCourant }">
<li ng-repeat="element in liste">
<li ng-show="compte != undefined">
Extension du DOM
<cotation value="GIB" />
[ Transclude : réutilisation du code déclaré dans vos balises ]
Fonction de conversion de valeur (currency, number, date...)
{{ user.birthday | date:"dd'/'MM'/'yyyy" }}
{{ products | filter:query }}
{{ products | filter:query | orderBy:price }}
Implémentez vos filtres !
Notre glue
$scope
function MyController($scope, $http){ ... }Utile Indispensable Navigation
$rootScope
$http
$location
Créer nos propres services et les injecter
$scope.$broadcast('eventName', args)
$scope.$emit('eventName', args)
$scope.$on('eventName', listener)
Un exemple de liste, avec filtres et quelques balises.
La correction si ca coince...
Quelle stratégie adopter ?
Comment organiser et charger un gros projet ?
Un exemple d'utilisation avec require.js
require(['MyApp','Angular','jQuery','app/controllers'], function(App) { App.initialize(); }
Un exemple d'utilisation avec require.js
var deps = ['Console', 'Angular', 'AngularExtra']; var __main__controllers = ['adminuser', 'group', ... (25 elts) 'stage', 'stageedit']; //add dependencies for (var i = 0; i < __main__controllers.length; i++) { deps.push('app/controllers/'+__main__controllers[i]); } define(deps, function (Console) { Console.info("controllers loaded", __main__controllers); });
L'utilisation de require.js demande de creuser la documentation d'AngularJS
Les metadonnées du HTML ne peuvent être utilisées (chargement asynchrone), il faut donc utiliser angular.bootstrap (qui n'a rien avoir avec bootstrap twitter)
Le projet ne peut rester éclaté dans 30 fichiers JS (pour des raisons de performances), il doit être minifié et donc obfusqué pour gagner en taille.
La plupart des outils de build JS dependent de node.js. NPM peut rapidement devenir un cauchemar sur un réseau fermé
app.controller('ProductCtrl', function($scope) { // do stuff $scope.var = ["hello"]; });
Résultat ...
app.controller("ProductCtrl",function(a){a.var=["hello"]});
Solution...
app.controller('ProductCtrl', ['$scope', function($scope) { // do stuff }]);
Plusieurs watchers modifient un même objet du scope a chaque update.
Plusieurs objets se réferençant se modifient mutuellement à chaque update.
<input type="text" ng-model="timestamp" ng-change="version++"/> <input type="text" ng-model="version" ng-change="timestamp = new Date()"/>
scope: { title: '@', // the title uses the data-binding from the parent scope onOk: '&', // create a delegate onOk function onCancel: '&', // create a delegate onCancel function visible: '=' // set up visible to accept data-binding }
L'héritage des propriétés et des méthodes ne se font pas de la même manière
<div ng-controller="FirstCtrl"> <div ng-controller="SecondCtrl"> </div> </div>
//dans le contexte du scope de SecondCtrl $parent.firstCtrlVar; //on doit utiliser le mot clé "$parent" pour accéder à la propriété du scope de FirstCtrl firstMethodCall(); //la méthode est heritée du scope de FirstCtrl
$parent.$parent.$parent.maVar
Angularjs, sans optimisation à outrance, permet de consommer un minimum de bande passante
2 way binding !
Contrôleur Appel de service Affectation du résultatVue ng-repeat sur la liste Ajout des éléments de navigation : filtre, tri...Modification d'un des item ? La liste est mise à jour en même temps...
En combinant quelques contrôles , on peut :
<li ng-repeat="compte in comptes" ng-click="clickOnCompte(compte)" ng-class="{active : compte == selection}" > {{ compte.libelle }} </li> <div ng-show="selection"> {{ selection.devise }} {{ selection.solde | number:2 }} </div>
function clickOnCompte(compte) { $scope.selection = compte; }
Un petit exemple d'édition d'une liste avec un formulaire
Un petit exemple d'édition d'une liste avec un formulaire ET validation
Plugin Google Chrome pour debugguer des applis AngularJS
Installation
npm install -g karma
Exemple de code
it('should render phone specific links', function() { input('query').enter('nexus'); element('.phones li a').click(); expect(browser().location().url()).toBe('/phones/nexus-s'); });
Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers.
http://www.polymer-project.org/getting-started.html
<!DOCTYPE html> <html> <head> <!-- 1. Shim missing platform features --> <script src="polymer-all/platform/platform.js"></script> <!-- 2. Load a component --> <link rel="import" href="x-foo.html"> </head> <body> <!-- 3. Declare the component by its tag. --> <x-foo></x-foo> </body> </html>
Portage d'AngularJS en dart !
Présentation réalisée en HTML avec reveal.js, versionnée avec git.
Les exemples utilisent twitter bootstrap.