Tamaris
<html> <head></head> <body> <div>hello</div> </body> </html>
<html ng-app="formation"> <head></head> <body> <div>hello</div> <script src="angular.js"></script> <script src="app.js"></script> </body> </html>
angular.module("formation",[]);
Il existe 2 modules principaux pour faire du routing AngularJS
angular.module('formation').config(function($routeProvider) { $routeProvider.when('/', { templateUrl: 'app/views/home/home.html', controller: 'HomeController' }); $routeProvider.when('/settings/', { templateUrl: 'app/views/settings/settings.html', controller: 'SettingsController' }); $routeProvider.otherwise({redirectTo: '/'}); });
<div ng-view></div>
<html ng-app="formation"> <head></head> <body> <div> {{1+2}} {{a+b}} {{user.name}} {{items[index]}} </div> <script src="angular.js"></script> <script src="app.js"></script> </body> </html>
<html ng-app="formation"> <head></head> <body> <div ng-controller="FormationController"> <input ng-model="maVal"> </div> <button ng-click="maFonction()"> {{buttonText}} </button> <script src="angular.js"></script> <script src="app.js"></script> </body> </html>
<div ng-if="maCondition == true">ng-show : Affichage conditionnel d'un élément
<div ng-show="maCondition == true">ng-repeat : Permet de répéter un élément avec un contexte donné
<div ng-repeat="monOjbet in monTableau"> <div>{{monObjet.maPropriete}}</div> </div>
<input type="text" ng-disabled="maCondition == true">ng-class : Ajoute une classe conditionnellement
<div ng-class="{'ma-classe':maCondition}">ng-click : Ajoute un écouteur sur le click
<div ng-click="maFonctionAuClic()">... et pleins d'autres
<html ng-app="formation"> <head></head> <body> <div ng-controller="FormationController"></div> <script src="angular.js"></script> <script src="app.js"></script> </body> </html>
angular.module('formation').controller('FormationController', function( $scope ){ $scope.variableAffiche = "hello"; } ));
<html ng-app="formation"> <head></head> <body> <div ng-controller="FormationController"> {{variableAffiche}} </div> <script src="angular.js"></script> <script src="app.js"></script> </body> </html>
angular.module('formation').controller('FormationController', function( $scope ){ $scope.maFonction = function(){ alert("hello"); }; } ));
<html ng-app="formation"> <head></head> <body> <div ng-controller="FormationController"> <input type="button" ng-click="maFonction()"/> </div> <script src="angular.js"></script> <script src="app.js"></script> </body> </html>
angular.module('formation', []).filter('yOrN', function() { return function(input) { return input ? 'y' : 'n'; }; });
{{true|yOrN}} -> 'y'
AngularJS apporte un lot de fonctionnalités concernant les formulaires.
Ces formulaires permettent de contrôler les balises input, textarea et select.
Ces formulaires vont permettre de construire dynamiquement des objets.
<div ng-controller="FormationController"> <form novalidate class="simple-form"> Name : <input type="text" ng-model="user.name"/> Email : <input type="email" ng-model="user.email"/> </form> <span>form = {{user.name}}</span> <span>form = {{user.email}}</span> </div>
Les éléments des champs de saisie sont rattachés via l'attribut ng-model.
L'attribut "novalidate" sert à désactiver la validation native du navigateur.
Des classes sont ajoutés automatiquement
<div ng-controller="FormationController"> <form novalidate class="simple-form"> Name : <input type="text" ng-model="user.name"/> Email : <input type="email" ng-model="user.email"/> </form> <span>form = {{user.name}}</span> <span>form = {{user.email}}</span> </div>
.simple-form input.ng-invalid.ng-touched { background-color: red; } .simple-form input.ng-valid.ng-touched { background-color: green; }
Il est possible d'ajouter des conditions pour la validité
Les états de ces conditions peuvent être contrôlés indépendament
E-mail: <input type="email" ng-model="user.email" name="uEmail" required/> <div ng-show="form.$submitted || form.uEmail.$touched"> <span ng-show="form.uEmail.$error.required"> L'adresse mail est obligatoire </span> <span ng-show="form.uEmail.$error.email"> L'adresse mail saisie n'est pas valide </span> </div>
Age: <input type="number" ng-model="user.age" name="uAge" required min="18" max="100"/> <div ng-show="form.$submitted || form.uAge.$touched"> <span ng-show="form.uAge.$error.required"> Le champ âge est obligatoire </span> <span ng-show="form.uAge.$error.min"> La valeur saisie est inférieure au minimum ( 18 ) </span> <span ng-show="form.uAge.$error.max"> La valeur saisie est supérieure au minimum ( 100 ) </span> </div>
La mise à jour du modèle peut être retardée, voir uniquement déclenchée lors d'un évènement
Utilisation de l'attribut "on-blur" pour déclencher la mise à jour du modèle quand on perd le focus sur le champ
<input type="text" ng-model="user.name" ng-model-options="{ updateOn: 'blur' }" />
Utilisation de l'attribut "debounced" pour déclencher la mise à jour du modèle après un certain temps sans modification
<input type="text" ng-model="user.name" ng-model-options="{ debounce: 500 }" />
Il est tout à fait possible de cumuler ces différnts déclencheurs
<input type="text" ng-model="user.name" ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }" />
angular.module('formation').service('FormationService', function(){ this.afficheAlerte = function(){ alert("hello"); } } ));
angular.module('formation').controller('FormationController', function( $scope, FormationService ){ $scope.maFonction = function(){ FormationService.afficheAlerte(); }; }; ));
<nom-directive></nom-directive>
<div nom-directive></div> <div data-nom-directive></div> <div x-nom-directive></div>
<div class="nom-directive"></div>
HTML
<nom-directive></nom-directive>
javascript
angular.module("formation").directive("nomDirective", function() { return { restrict: 'E', //E pour élément, A pour attribut template: '<div>test</div>' }; });
HTML
<nom-directive param1="text" param2="value" param3="function"> </nom-directive>
Javascript
angular.module("formation").directive("nomDirective", function() { return { restrict: 'E', //E pour élément, A pour attribut scope:{ param1 : '@', // Reception d'une chaine de caractère param2 : '=', // Réception d'une variable param3 : '&' // Réception d'une fonction } template: '<div>test</div>' }; });
angular.module('formation').controller('FormationController', function( $scope ){ $scope.maFonction = function(){ alert("hello"); }; } ));
angular.module("formation").directive("nomDirective", function() { return { restrict: 'E', //E pour élément, A pour attribut controller : 'FormationController', scope:{ param1 : '@', // Reception d'une chaine de caractère } template: '<div ng-click="maFonction()">test</div>' }; });
Utilisation de l'attribut TemplateURL
angular.module("formation").directive("nomDirective", function() { return { restrict: 'E', //E pour élément, A pour attribut controller : 'FormationController', scope:{ param1 : '@', // Reception d'une chaine de caractère } templateUrl: '/formation/templates/madirective.html' }; });
Le template passé en paramètre ne doit avoir qu'un seul élément parent.
<div> ... </div> <div> ... </div>
<div> ... </div>
Quand plusieurs directives sont sur le même élément, une priorité d'exécution peut être définie
angular.module("formation").directive("nomDirective", function() { return { restrict: 'E', //E pour élément, A pour attribut controller : 'FormationController', priority: 1, scope:{ param1 : '@', // Reception d'une chaine de caractère } templateUrl: '/formation/templates/madirective.html' }; });
La directive ayant la priorité la plus grande sera exécutée en premier
La priorité est par défaut à 0
AngularJS utilise un système de Dirty-Checking. Exemple, je click sur un bouton avec un ng-click
Que se passe-t-il quand un nombre d'éléments important est synchronisé en two-way data-binding ?
Le nombre maximum à avoir pour obtenir une expérience utilisateur correcte est "décrite" à 2000 watchs
Pour les diminuer, il est possible d'associer des éléments statiques en one-way :
Des directives telles que "ngClick" provoquent une réévaluation de toute la page à chaque click. Un ngMouseOver le fait à chaque mouvement de souris sur l'élément suivi
Tentez d'utiliser :