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'
};
}
};
});