AngularJS TP 4: Les templates - e

Transcription

AngularJS TP 4: Les templates - e
AngularJS
TP 4: Les templates
Ce TP explique l’utilisation des templates dans AngularJS.
1
Mise en relation de données
Dans le TP précédent, nous avons utilisé des modèles d’Angular en utilisant ng-model et la mise en relation de
données avec {{ name }}. C’est un modèle basique de mise en relation de données. Dans cette section, nous essayons
de taire correspondre des élément d’entrée HTML dans un Angular model. Nous commençons par créer un module
appelé SimpleBinding. Créez un fichier appelé simplebinding.js contenant le script suivant :
var myApp = angular.module(’SimpleBinding’,[]);
myApp.controller(’MyControlller’, [’$scope’, function($scope) {
$scope.customer = {}
}]);
Vous pouvez constater que nous avons défini customer en tant qu’objet JSON. L’étape suivante consiste à créer un
fichier HTML, appelé simplebinding.html contenant le code suivant :
<!DOCTYPE html>
<html ng-app="SimpleBinding">
<head>
<title>Simple Module</title>
<script src="lib/angular.min.js"></script>
<script src="controllers/simplebinding.js"></script>
</head>
<body ng-controller="MyControlller">
<form>
</form>
</body>
</html>
Dans la section suivante nous allons insérer des champs dans le formulaire (à l’intérieur des balises form).
1.1
Manipuler des éléments d’entrée
Les premières données d’entrée sont name et email. On définit un modèle Angular ng-model="customer.name"
et ng-model="customer.email" .
<div>
<label
<input
</div>
<div>
<label
<input
</div>
for="name">Name: </label>
type="text" id="name" ng-model="customer.name">
for="email">Email: </label>
type="text" id="email" ng-model="customer.email">
1.2
Sélection d’élément
Concernant es éléments à sélectionner, nous définissons une liste de pays et un ng-model en tant quecustomer.country.
<div>
<label for="selectcountry">Country:</label>
<select name="selectcountry" id="selectcountry" ng-model="customer.country">
<option value="AU">Australia</option>
<option value="CA">Canada</option>
<option value="FR">France</option>
<option value="DE">Germany</option>
<option value="NL">Netherlands</option>
<option value="CH">Switzerland</option>
<option value="GB">United Kingdom</option>
<option value="US">United States</option>
</select>
</div>
1.3
L’élément bouton radio
Concernant le groupe de bouton radio, nous définissons le même nom, appelé color. Nous définissons aussi un
modèle Angular avec le même nom: customer.color.
<div>
<label>Preference color:</label>
<input type="radio" name="color" id="radio1" value="Red" ng-model="customer.color">
<label for="radio1">Red</label>
<input type="radio" name="color" id="radio2" value="Green" ng-model="customer.color">
<label for="radio2">Green</label>
<input type="radio" name="color" id="radio3" value="Blue" ng-model="customer.color">
<label for="radio3">Blue</label>
</div>
1.4
L’entrée de la date
L’entrée correspondant à une date est un élément pour lequel nous pouvons définir un modèle Angular en tant que
customer.birthdate
<div>
<label for="birthdate">Birth Date:</label>
<input type="date" name="birthdate" id="birthdate" ng-model="customer.birthdate">
</div>
1.5
Fourchette
La fourchette de valeurs d’entrées correspond aux entrées qui peuvent être sélectionnées entre une valeur minimale
et une valeur maximale. Nous devons définir donc, un min et un max concernant l’élément en question. Pour le
modèle Angular, nous définissons ng-model="customer.skilllevel".
<div>
<label for="level">Skill level:</label>
<input type="range" name="level" id="level" min="1" max="100" alt="Level 1-100" ng-model=
"customer.skilllevel" >
</div>
1.6
CheckBox
Concernant la checkbox, nous définissons un modèle Angular customer.agree.
<div>
<label for="agree"><input type="checkbox" id="agree" ng-model="customer.agree" >
I agree to the terms & conditions</label>
</div>
1.7
Bouton Submit
nous définissons le bouton Submit sans utiliser un modèle Angular.
without Angular model.
We define submit button
<div>
<button type="submit" >Submit</button>
</div>
1.8
Résultat
Pour voir quel utilisateur a renseigné les données requises, nous pouvons utiliser {{
customer }}.
<div>
Value:
</div>
1.9
{{ customer }}
Exécution de l’application
Enregistrez votre code et exécutez le fichier simplebinding.html. Renseignez les données
en entrée et observez le résultat. Commentez le principe et l’intérêt d’un telle application.
2
Répétition de données
Vous avez des données sous la forme d’un tableau et vous voulez les montrer en HTML. AngularJS
offre ng-repeat pour effectuer des boucles concernant les élément des données. A titre
d’exemple, nous avons un contrôleur avec des données JSON. Créez un fichier intitulé repeatbind
contenant le code suivant :
var myApp = angular.module(’RepeatBinding’,[]);
myApp.controller(’MyControlller’, [’$scope’, function($scope) {
$scope.customers = [
{name:’user1’,email:’[email protected]’,country:’UK’},
{name:’user2’,email:’[email protected]’,country:’NL’},
{name:’user3’,email:’[email protected]’,country:’DE’},
{name:’user4’,email:’[email protected]’,country:’UK’},
{name:’user5’,email:’[email protected]’,country:’US’},
{name:’user6’,email:’[email protected]’,country:’US’},
{name:’user7’,email:’[email protected]’,country:’CA’}
]
}]);
Comme vous pouvez le constater, customers (clients) consiste en un ensemble de données
relatives aux clients; nom, email et pays. Maintenant, ctéez le fichier HTML repeatbinding.htm
contenant le script suivant :
<!DOCTYPE html>
<html ng-app="RepeatBinding">
<head>
<title>Demo Repeat Data Binding</title>
<script src="lib/angular.min.js"></script>
<script src="controllers/repeatbinding.js"></script>
<style>
.item {
width: 350px;
height: 50px;
background-color: #ff6e68;
}
</style>
</head>
<body ng-controller="MyControlller">
</body>
</html>
Maintenant, dans la section body il s’agit de pré-remplir les données répétées en utilisant
ng-repeat = "customer in customers". Ensuite, nous effectuant la liaison des données
dans le HTML.
<h2>Demo data binding with repeat data</h2>
<br>
<div ng-repeat="customer in customers">
<p class="item">{{customer.name}} | {{customer.email}} | {{customer.country}}</p>
</div>
Enregistrez le code puis exécutez le fichier repeatbinding.html.
le résultat.
3
Observez et commentez
Répétition imbriquée de données
Parfois, nous pouvons avoir une table de données avec un modèle de relation du type one-to-many
Par exemple, tableau de commandes et les détails de la commande. A chaque commande (order)
correspondent des données concernant cette commande dans orderdetails.
Maintenant, nous allons travailler avec ce modèle de données, par exemple nous avons des
commandes et des détails dans un tableau. Créez un fichier nestedrepeated.js contenant
le script suivant :
var myApp = angular.module(’NestedRepeatBinding’,[]);
myApp.controller(’MyControlller’, [’$scope’, function($scope) {
$scope.orders = [
{
id:1,
transid:’123456’,
customer:’user1’,
created:’3/1/2014’,
details: [
{name:’product1’, quantity:2,
{name:’product2’, quantity:1,
{name:’product3’, quantity:3,
{name:’product4’, quantity:5,
]
},
{
id:2,
transid:’123457’,
customer:’user2’,
created:’3/8/2014’,
details: [
{name:’product1’, quantity:1,
{name:’product2’, quantity:1,
{name:’product4’, quantity:2,
]
},
{
id:3,
transid:’123458’,
customer:’user1’,
created:’3/15/2014’,
details: [
{name:’product1’, quantity:4,
{name:’product2’, quantity:3,
{name:’product3’, quantity:2,
{name:’product4’, quantity:1,
]
},
{
id:4,
transid:’123459’,
customer:’user2’,
created:’3/23/2014’,
details: [
{name:’product1’, quantity:1,
{name:’product2’, quantity:1,
]
}
]
}]);
price:2.5},
price:1.4},
price:3.5},
price:2.8}
price:2.5},
price:1.4},
price:2.8}
price:2.5},
price:1.4},
price:3.5},
price:2.8}
price:2.5},
price:1.4}
L’étape suivante consiste à utiliser ce contrôleur dans le HTML. Créez un fichier nestedrepeat.
contenant le script suivant :
<!DOCTYPE html>
<html ng-app="NestedRepeatBinding">
<head>
<title>Demo Repeat Data Binding</title>
<script src="lib/angular.min.js"></script>
<script src="controllers/nestedrepeated.js"></script>
<style>
.item {
width: 350px;
height: 30px;
background-color: #ff6e68;
} .subitem {
margin-left: 30px;
width: 320px;
height: 30px;
background-color: #6fff90;
}
</style>
</head>
<body ng-controller="MyControlller">
</body>
</html>
Dans la section body du HTML, il s’agit de préremplir les commandes (orders) ensuite pré-rempli
les détails concernant ces commandes (order.details).
Écrivez le script suivant :
<h2>Demo data binding with nested repeat data</h2>
<br>
<div ng-repeat="order in orders">
<p class="item">{{order.id}} | {{order.transid}} | {{order.customer}} | {{order.created}}</p>
<div ng-repeat="item in order.details">
<p class="subitem">{{item.name}} | {{item.quantity}} | {{item.price}}</p>
</div>
</div>
Enregistrez le code et exécutez le fichier nestedrepeat.html.
?
4
Quel est le résultat obtenu
Le filtrage des données
Nous pouvons filtrer les données en fonction d’un critère donné.
pour le filtrage avec AgularJS.
{{ expression | filter1 | filter2 | ...
Voici une syntaxe basique
}}
En tant qu’exemple nous utilisons le code de la section 2 mais en modifiant le fichier
HTML. Créez un fichier simplefilter.js .Ce fichier contient le même code que repeatbinding.js
mais en modifiant les données dans les entrée name et email.
Voici le contenue de simplefilter.js.
var myApp = angular.module(’SimpleFilter’,[]);
myApp.controller(’MyControlller’, [’$scope’, function($scope) {
$scope.customers = [
{name:’andi’,email:’[email protected]’,country:’UK’},
{name:’brown’,email:’[email protected]’,country:’NL’},
{name:’jake’,email:’[email protected]’,country:’DE’},
{name:’jane’,email:’[email protected]’,country:’UK’},
{name:’mike’,email:’[email protected]’,country:’US’},
{name:’xemmy’,email:’[email protected]’,country:’US’},
{name:’zahra’,email:’[email protected]’,country:’CA’}
]
}]);
Coté HTML, nous devons créer un fichier simplefilter.html. Copiez le contenu du fichier
repeatbinding.html en y ajoutant une entrée concernant le filtrage. Dans ng-repeat, nous
ajoutons "..| filter:query". Ceci signifie un filtrage basé sur les données d’entrée
depuis le modèle query.
Voici le code complet pour simplefilter.html.
<!DOCTYPE html>
<html ng-app="SimpleFilter">
<head>
<title>Demo Repeat Data Binding</title>
<script src="lib/angular.min.js"></script>
<script src="controllers/simplefilter.js"></script>
<style>
.item {
width: 350px;
height: 50px;
background-color: #ff6e68;
}
</style>
</head>
<body ng-controller="MyControlller">
<h2>Demo filtering for repeated data</h2>
<br>
<p>
<label for="filter">Filter:</label>
<input type="text" id="filter" ng-model=’query’>
</p>
<div ng-repeat="customer in customers | filter:query">
<p class="item">{{customer.name}} | {{customer.email}} | {{customer.country}}</p>
</div>
</body>
</html>
Enregistrez le code et exécutez le fichier simplefilter.html.
le résultat obtenu.
Commentez et expliquez