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 :