On Github ocombe / conf-angularjs-101
Backbone.JS
AngularJS
EmberJS
MeteorJS
Knockout
Développé par Google
100% javascript et html (pas de précompilation)
~MVC Front-end
IE8+ jusqu'à 1.2.x, IE9+ à partir de 1.3
Permet d'étendre le HTML (directives)
Binding bi-directionnel
Inclut jquery lite
Testable (unitaire & e2e)
Injection de dépendances
Très complet
Très fun (en toute objectivité)
Très grosse communauté (> 800 000 developpeurs)
Une documentation inégale
Pas très copain avec le SEO (ça change!)
Une courbe d'apprentissage chaotique
<!DOCTYPE html> <html ng-app> <head> <title>Mon application</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.js"></script> </head> <body> <input ng-model="name" type="text" placeholder="Ton nom"> <p>Hello {{ name }}</p> </body> </html>
Bonjour
<html ng-app="MyApp"> ... </html>
var myApp = angular.module('MyApp', []);
Et on ajoute un controlleur :
<html ng-app="MyApp"> <div ng-controller="MyCtrl"> Secondes: {{ seconds }} </div> </html>
myApp.controller('MyCtrl', function($scope, $interval) { $scope.seconds = 0; $interval(function() { $scope.seconds++; }, 1000); });
l'équivalent des modèles de l'application et utilisant un héritage réplicant la structure du DOM ($rootScope)
un moyen d'échanger des données entre vue et controlleur
Toute propriété ou méthode appelée dans une expression fait référence au $scope (et à ses parents)
On peut utiliser
{{ today | date:'dd/mm/yyyy' }}
var myApp = angular.module('MyApp', ['ui.router']);
myApp.controller('MyCtrl', function($scope, $interval) { ... });
myApp.controller('MyCtrl', function($scope, $interval) { ... });
a.controller('MyCtrl', function(b, c) { ... });
myApp.controller('MyCtrl', ['$scope' , '$interval', function($scope, $interval) { ... }] );
a.controller('MyCtrl', ['$scope' , '$interval', function(b, c) { ... }]);
Gère tout ce qui est indépendant des vues
Est défini une fois puis injecté à la demande
var app = angular.module('myServiceModule', [])
app.controller('MyController', ['$scope','notify', function ($scope, notify) { $scope.callNotify = function(msg) { notify(msg); }; }] )
app.factory('notify', ['$window', function(win) { var msgs = []; return function(msg) { msgs.push(msg); if (msgs.length == 3) { win.alert(msgs.join("\n")); msgs = []; } }; }]);
Sont appelées via un marqueur dans le DOM (attribut, élément, commentaire ou classe CSS)
Sont compilées lors de leur insertion dans le DOM
Peuvent attacher un comportement spécifique au DOM
<button ng-click="doSomething()"></button>
Peuvent modifier le DOM
<modal></modal>
<div class="modal"></div>
Peuvent surcharger des éléments html existants
Peuvent accéder au $scope et le manipuler ou en créer un nouveau isolé
Peuvent accéder aux services
var docs = angular.module('docsSimpleDirective', [])
<div ng-controller="Controller"> <div my-customer></div> </div>
docs.controller('Controller', ['$scope', function($scope) { $scope.customer = { name: 'Naomi', address: '1600 Amphitheatre' }; }])
docs.directive('myCustomer', function() { return { template: 'Name: {{customer.name}}, Address: {{customer.address}}' }; });
<div ng-controller="Controller"> <div my-customer>Name: Naomi, Address: 1600 Amphitheatre</div> </div>
docs.directive('myCustomer', function() { return { template: 'Name: {{customer.name}}, Address: {{customer.address}}', link: function link($scope, $element, $attrs) { $scope.customer = { name: 'Naomi', address: '1600 Amphitheatre' }; } }; });