AngularJS 2.0 utilisera pleinement ECMAScript6, qui est la prochaine standardisation du JavaScript (et utilisera un compilateur EM6 => EM5 pour la compatibilité).
var obj = {'foo': 'bar'};
obj.foo == obj['foo'];
obj.foobar = 42;
obj['foobar'] = 21;
obj.method = function(){
console.log('I am here!');
};
obj.method();
Ou comment ne plus utiliser jQuery.
Ce paradigme regroupe les fonctions nécessaires en trois catégories :
AngularJS est un framework JavaScript qui permet :
La courbe d'apprentissage est en grande partie du au fait qu'AngularJS est un ensemble de composants et qu'il est impossible de tous les apprendre en meme temps. On se demandera souvent "pourquoi je dois faire comme ca" pour utiliser un certain composant avant d'avoir compris son fonctionnement.
<script src="chemin/vers/angular.js"></script>
ng-app
<html ng-app="myApp">
Le JavaScript sera plutot mis à la fin du
afin de s'assurer que l'application s'affiche bien avant que les scripts soit télécharger.Le nom de l'application ("myApp") sera définis plus tards dans ce que l'on appelle un "module". ng-app n'est pas obligatoirement sur la balise html, mais là où l'application se trouve (d'où le fait de pouvoir faire plusieurs applications sur une seul page).
Mise à jour automatiquement gràce au "dirty checking".
Le "Scope" contient les modèles.
ng-model
permet de lier un champs de formulaire à une valeur du modèle.
{{ qty * cost }} est une expression permettant l'affichage de valeur, également mis à jour automatiquement.
Basé sur des fichiers partials
(HTML).
Voici quelques expressions valides :
{{ 1 + 2 }}
{{ a + b }}
{{ user.name }}
{{ items[index] }}
<input ng-model="cost" />
Permet de modifier le DOM. Définis une nouvelle balise ou un nouvel attribut HTML. Les directives s'écrivent en camelCase mais s'utilisent en lower-case.
Apache, nginx, ... Grunt, gulp.
git
.npm install
).npm start
).http://localhost:8000/app/
).view1
(app/view1/view1.html
) pour :input
.input
.Lier l'input à une valeur en utilisant ng-model
.
Expliquer les dossier node_modules
et bower_components
.
Un contrôleur :
scope
de l'application.Un service permet de réutiliser du code métier. Le scope est vu à la prochaine slide.
S'occupe d'une partie de l'application, il y aura donc plusieurs controleur. Un controleur peut etre inclus dans un autre pour s'occuper d'une sous-partie spécifique.
Un scope :
$scope
sur chaque contrôleur.$rootScope
pour le scope de l'application.Quelque caractéristiques :
{{ username }}
-> $scope.username
.$scope.$apply
/ $scope.$broadcast
(propager les changements qui ont lieu en dehors d'AngularJS).Fichier JS :
angular.module('myApp.view1', [])
.controller('View1Controller', function($scope) {
$scope.name = 'Toto';
});
Fichier HTML :
<div ng-controller="View1Controller">
{{ name }}
</div>
Fichier JS :
angular.module('myApp.view1', [])
.controller('View1Controller', function($scope) {
$scope.name = 'Toto';
$scope.welcome = 'Bienvenue !';
});
angular.module('myApp.view2', [])
.controller('View2Controller', function($scope) {
$scope.name = 'Tutu';
});
Fichier HTML :
<div ng-controller="View1Controller">
{{ welcome }} {{ name }}
<div ng-controller="View2Controller">
{{ welcome }} {{ name }}
{{ welcome }} {{ $parent.name }}
</div>
</div>
Écoute pour un événement, listener est une fonction de la forme function(event, args)
.
Propage l'événement vers le bas. L'événement ne peut pas être arrêté.
Propage l'événement vers le haut. L'événement peut être arrêté.
components
, view1
et view2
dans app
.body
en ne laissant que les scripts angular.js
et app.js
.app.js
et recréer un module todo
avec un controlleur TodoController
.ng-app
égale à todo
.Ajouter une liste d'objet au scope du module todo
de la forme donné (id
doit etre différent pour chaque objet).
{'id' : 1, 'date': Date, 'title': 'Finir le TP', 'done': false}
Afficher la liste de taches avec le titre et le statut de chaque tache (done
).
Utiliser ng-repeat
pour lister les taches. Utiliser un bouton avec ng-click
pour les actions.
Un filtre :
|
.:
.{{ [3, 2, 1, 4] | limitTo:2 }}
{{ "Bonjour" | lowercase }}
Fichier JS :
angular.module('myApp.filters', [])
.filter('capitalize', function(){
return function(input) {
if (input) {
return input[0].toUpperCase() + input.slice(1);
}
}
});
Fichier HTML :
{{ 'Je SuiS un TeXte uN peU biZaRRe' | lowercase | capitalize }}
$filter
$filter
est un service permettant d'utiliser les filtres en javascript :
var upercase = $filter('upercase');
var uper = upercase('Bonjour'); // uper === 'BONJOUR'
Utiliser les filtres date
, orderBy
et filter
.
Une route :
partial
)./user/123
angular.module('myApp', ['ngRoute'])
.config(function($routeProvider){
$routeProvider
.when('/', {
templateUrl: 'partials/home.html',
})
.when('/todo/:id', {
templateUrl: 'partials/todo.html',
controller: 'TodoController',
})
.otherwise({redirectTo: '/'});
});
$routeParams
angular.module('todo', [])
.controller('TodoController', function($scope, $routeParams) {
$scope.id = $routeParams.id;
// ...
});
ngRoute
est un module à part et doit être ajouté aux dépendances de l'application.
Une route n'a pas forcément de contrôleur associé, ni de template.
index.html :
<html ng-app="myApp">
<head>[...]</head>
<body>
[...]
<div ng-view></div>
[...]
<script src="angular.js"></script>
<script src="angular-route.js"></script>
<script src="app.js"></script>
</body>
</html>
partials/home.html :
<h1>Bienvenue !</h1>
partials/todo.html :
<h1>{{ todo.name }}</h1>
ng-view
indique l'endroit ou les partials
seront affichés.
C'est comme cela que view1
et view2
sont gérées dans angular-seed
.
/#/todo/42
./todo/42
.angular.module('myApp', ['ngRoute'])
.config(['$locationProvider'], function($locationProvider) {
$locationProvider.html5Mode(true);
});
Le serveur doit rediriger toutes les requêtes vers l'index.html
.
$location
permet de récuperer ou de changer l'url actuelle. Il utilise l'api d'historique d'HTML5 si activée et disponible.
.path()
.search()
.hash()
.url()
Les changements de #
sont naturellements sauvegardé par le navigateur.
En mode HTML5, l'api de l'historique est utilisé.
Quatre événements sont propagés par le service $route
.
$routeChangeStart
: Avant la résolution de l'URL.$routeChangeSuccess
: Après la résolution de l'URL.$routeChangeError
: En cas d'erreur.$routeUpdate
: Si reloadOnSearch
est mis à false
, et si le contrôleur est le même.ngRoutes
.Utiliser le $rootScope
pour stocker les taches afin de les avoir sur tout les controleurs. (Mauvaise pratique ! Un service devrait etre utilisé à la place).
Table of contents | t |
---|---|
Exposé | ESC |
Autoscale | e |
Full screen slides | f |
Presenter view | p |
Source files | s |
Slide numbers | n |
Blank screen | b |
Notes | 2 |
Help | h |