TP Angular
TP Angular
EXERCICE 1:
EXERCICE 3:
Modifier le code script de l'exercice2 en utilisant la notion de controller.
EXERCICE 4:
donner le code d'un script qui permet d'additionner deux nombres.
en utilisant deux lignes de saisie (input)
en utilisant deux variables initialiser
correction tp1
exercice 2
<!DOCTYPE html>
<html ng-app>
<head>
<title>Hello, Angular</title>
<script src="https://code.angularjs.org/1.5.8/angular.min.js"></script>
</head>
<body ng-init="name='World'">
<label>Name</label>
<input ng-model="name" />
<span>Hello, {{ name }}!</span>
<p ng-bind="name"></p>
</body>
</html>
exercice 3
<!DOCTYPE html>
<html ng-app="exemple">
<head>
<title>Hello, Angular</title>
<script src="https://code.angularjs.org/1.5.8/angular.min.js"></script>
</head>
<body >
<script>
var app=angular.module('exemple', [])
app.controller('ExampleController', function($scope) {
$scope.nom = 'madame';
});
</script>
<div ng-controller="ExampleController">
<label>Enter name: <input type="text" ng-model="nom"></label><br>
Hello <span ng-bind="nom"></span>!
</div>
</body>
</html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></
script>
<body>
<script>
var app = angular.module("myApp", []);
app.controller("myCtrl", function($scope) {
$scope.firstName = "John";
$scope.lastName = "Doe";
});
</script>
</body>
</html>
exercice 4
<!doctype html>
<html ng-app>
<head>
<meta charset="UTF-8">
<title>My First Angular</title>
<script src="https://code.angularjs.org/1.5.8/angular.min.js"></script>
</head>
Exercice 1
donner le script qui permet d'initialiser une variable users qui contient un ensemble d'utilisateur et puis
l'afficher en utilisant la directive nb-repeat .
salah
ali
mohamed
{{users|filter:'m'}}
{{users|orderBy:+users}}
tp2- exercice2
<!doctype html>
<html ng-app="exemple">
<head>
<meta charset="UTF-8">
<title>Example - example-controller-scope-inheritance</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.0/angular.min.js"></
script>
</head>
<body >
<script>
var app=angular.module('exemple', [])
app.controller('MyController', ['$scope', function($scope) {
$scope.title='Module Simple';
$scope.result = 0;
$scope.add = function(a,b) {
$scope.result = a+b;
};
$scope.multiple = function(a,b) {
$scope.result = a*b;
};
}])
</script>
<div ng-controller="MyController">
<br>
<h1>Demo {{title}}</h1>
<div>
<p>
<label for="valA">Valeur de A:</label>
<input type="number" id="valA" ng-model='valA'>
</p>
<p>
<label for="valB">Valeur de B:</label>
<input type="number" id="valB" ng-model='valB'>
</p>
<p>
Result: {{ result }}</p>
</p><button ng-click="add(valA,valB)">Additionner</button>
<button ng-click="multiple(valA,valB)">Multiplier</button>
</p>
</div>
</div>
</body>
</html>
Exercice 1
donner le script qui permet d'initialiser une variable voiture dont on fixe la marque et couleur (type
intervalle) d'un ensemble de voiture.
a- afficher toutes les voitures
Exercice 3
Le but est de construire un tableau qui affiche des personnes avec leur nom et leur âge. On prévoit deux
zones de texte pour entrer les informations. On veut que le tableau s'actualise à mesure :
correction
exercice 1
a) <div ng-app>
<div ng-init="voitures = [
{marque:'Renault', couleur:'verte'},
{marque:'Mercedes', couleur:'rouge'},
{marque:'Rolls', couleur:'or'},
{marque:'Ferrari', couleur:'rouge'}]">
J'ai {{voitures.length}} voitures :
<ul><li ng-repeat="voiture in voitures">
Une {{voiture.marque}} {{voiture.couleur}}.</li></ul>
</div></div>
b) J'ai des voitures rouges :
<ul><li ng-repeat="voiture in voitures" ng-show="voiture.couleur == 'rouge'">
Une {{voiture.marque}}.</li></ul>
exercice 2
<div ng-app>
<div ng-init="articles = [
{nom:'Farine', prix:2.3},
{nom:'Sucre', prix:1.35},
{nom:'Gâteaux', prix:3.9},
{nom:'Huile', prix:5.25}
]">
<table>
<caption>J'ai {{articles.length}} articles à acheter</caption>
<tr>
<th>Article</th>
<th>Prix</th>
</tr>
<tr ng-repeat="article in articles">
<td>{{article.nom}}</td>
<td>{{article.prix | currency:"€ "}}</td>
</tr>
<tr>
</table> </div></div>
exercice 3
<div ng-app ng-controller="Controleur">
<form ng-submit="ajouter(nom, age)">
Nom : <input type="text" name="nom" ng-model="nom">
Age : <input type="number" name="age" ng-model="age">
<br>
<button type="submit">Ajouter</button>
</form>
<table>
<caption>Personnes</caption>
<tr>
<th>Nom</th>
<th>Age</th>
</tr>
<tr ng-repeat="personne in personnes">
<td>{{personne.nom}}</td>
<td>{{personne.age}}</td>
</tr>
</table>
<script>
function Controleur($scope) {
$scope.personnes = new Array();
$scope.ajouter = function(nom, age) {
$scope.personnes.push({'nom': nom, 'age': age});
};
}
</script>
</div>
La seule difficulté réside dans le fait que cette fois la méthode du contrôleur comporte des paramètres. La
déclaration ngSubmit permet d'intercepter la soumission du formulaire et de l'orienter sur la méthode du contrôleur. Nous
n'avons rien prévu dans notre code concernant la validité des données saisies, si ce n'est de préciser le type des zones, en
particulier number pour l'âge. Si vous regardez le code généré vous allez trouver de nouvelles classes :
Ce sont : ng-valid, ng-dirty et ng-valid-number. Ce sont des classes de travail d'AngularJS. On se rend compte qu'elles
ont à voir avec la validation des données. Entrez autre chose qu'un nombre pour l'âge et vous verrez que la valeur ne s'inscrit
pas dans le tableau. La classe ng-valid-number se transforme alors en ng-invalid-number. Tout ça est géré par le
contrôleur de formulaire d'AngularJS.
Institut Supérieur de Tp4:Angularjs 1MP IDM
Gabes
Année Universitaire Responsable:Olfa Jabri
2021/2022
Exercice 1
ecrire un script qui permet de rechercher par nom et par tous autre champs dans un tableau qui contient
des personnes .
Exercice 2
on voudrait faire une recherche par âge. donner le script qui permet d'afficher les personnes dont leurs âges
>40
tp4
exercice 1
<div ng-app="monApplication">
<div ng-controller="Controleur">
<div class="form-group">
<label for="nom">Entrez un nom :</label>
<input type="text" class="form-control" id="nom"
placeholder="Entrez un nom ici" ng-model="recherche.nom">
</div>
<div class="form-group">
<label for="nom">Entrez un mot pour la recherche sur tous
les champs :</label>
<input type="text" class="form-control" id="nom"
placeholder="Entrez un mot ici" ng-model="recherche.$">
</div>
<table class="table table-bordered">
<tr>
<th>Nom</th>
<th>Prénom</th>
<th>Age</th>
<th>Sexe</th>
</tr>
<tr ng-repeat="personne in personnes | filter:recherche">
<td>{{ personne.nom }}</td>
<td>{{ personne.prenom }}</td>
<td>{{ personne.age }} ans</td>
<td>{{ personne.sexe }}</td>
</tr>
</table>
</div>
<script>
var monModule = angular.module('monApplication', []);
monModule.factory('Personnes', function() {
var Personnes = [
{ nom:'Dupont', prenom:'Albert', age:25, sexe:'M' },
{ nom:'Durand', prenom:'Leon', age:40, sexe:'M' },
{ nom:'Saulvit', prenom:'Paul', age:50, sexe:'M' },
{ nom:'Ragout', prenom:'Martine', age:42, sexe:'F' },
{ nom:'Bernard', prenom:'Valérie', age:27, sexe:'F' },
{ nom:'Tolout', prenom:'Jacques', age:63, sexe:'M' },
];
return Personnes;
});
monModule.controller('Controleur', ['$scope', 'Personnes',
function ($scope, Personnes) {
$scope.personnes = Personnes;
}
]);
</script>
</div>
<div ng-init="friends = [{name:'John', phone:'555-1276'},
{name:'Mary', phone:'800-BIG-MARY'},
{name:'Mike', phone:'555-4321'},
{name:'Adam', phone:'555-5678'},
{name:'Julie', phone:'555-8765'},
{name:'Juliette', phone:'555-5678'}]"></div>
<table id="searchTextResults">
<tr><th>Name</th><th>Phone</th></tr>
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
</tr>
</table>
<hr>
<table id="searchObjResults">
<tr><th>Name</th><th>Phone</th></tr>
<td>{{friendObj.name}}</td>
<td>{{friendObj.phone}}</td>
</tr>
</table>
exercice 2
<div ng-app="monApplication">
<div ng-controller="Controleur">
<table class="table table-bordered">
<caption>Personnes filtrées pour un âge supérieur à 40 ans</caption>
<tr>
<th>Nom</th>
<th>Prénom</th>
<th>Age</th>
<th>Sexe</th>
</tr>
<tr ng-repeat="personne in personnes | Age:40">
<td>{{ personne.nom }}</td>
<td>{{ personne.prenom }}</td>
<td>{{ personne.age }} ans</td>
<td>{{ personne.sexe }}</td>
</tr>
</table>
</div>
<script>
var monModule = angular.module('monApplication', []).
factory('Personnes', function() {
var Personnes = [
{ nom:'Dupont', prenom:'Albert', age:25, sexe:'M' },
{ nom:'Durand', prenom:'Leon', age:40, sexe:'M' },
{ nom:'Saulvit', prenom:'Paul', age:50, sexe:'M' },
{ nom:'Ragout', prenom:'Martine', age:42, sexe:'F' },
{ nom:'Bernard', prenom:'Valérie', age:27, sexe:'F' },
{ nom:'Tolout', prenom:'Jacques', age:63, sexe:'M' },
];
return Personnes;
}).
filter('Age', function () {
return function (items, age) {
var out = [];
angular.forEach(items, function (item) {
if(item.age > age) out.push(item);
});
return out;
}
}).
controller('Controleur', ['$scope', 'Personnes',
function ($scope, Personnes) {
$scope.personnes = Personnes;
}
]);
</script>
</div>
</span>
div ng-init="friends = [{name:'John', phone:'555-1276'},
{name:'Mary', phone:'800-BIG-MARY'},
{name:'Mike', phone:'555-4321'},
{name:'Adam', phone:'555-5678'},
{name:'Julie', phone:'555-8765'},
{name:'Juliette', phone:'555-5678'}]"></div>
<table id="searchTextResults">
<tr><th>Name</th><th>Phone</th></tr>
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
</tr>
</table>
<hr>
<table id="searchObjResults">
<tr><th>Name</th><th>Phone</th></tr>
<td>{{friendObj.name}}</td>
<td>{{friendObj.phone}}</td>
</tr>
</table>
1MP IDM
Les components Responsable:Olfa Jabri
Institut Supérieur de
Gabes
Afin d'assurer un bon fonctionnement de votre projet angular en tant que style on doit ajouter
le BOOTSTRAP et scss.
cd mon-projet-angular
ng add @ng-bootstrap/ng-bootstrap
"styles": ["./node_modules/bootstrap/dist/css/bootstrap.css",
],
"src/styles.scss"
1MP IDM
Responsable:Olfa Jabri
Le datbindinag
Institut Supérieur de
Gabes
L'intérêt d'utiliser Angular est de pouvoir gérer le DOM (Document Object Model : les éléments
HTML affichés par le navigateur) de manière dynamique, et pour cela, il faut utiliser la liaison
de données, ou "databinding".
le databinding, c'est la communication entre votre code TypeScript et le template HTML qui
est montré à l'utilisateur. Cette communication est divisée en deux directions :
les informations venant de votre code qui doivent être affichées dans le navigateur, comme
par exemple des informations que votre code a calculé ou récupéré sur un serveur. Les
deux principales méthodes pour cela sont le "string interpolation" et le "property binding" ;
les informations venant du template qui doivent être gérées par le code : l'utilisateur a
rempli un formulaire ou cliqué sur un bouton, et il faut réagir et gérer ces événements. On
parlera de "event binding".
1- String interpolation
L'interpolation est la manière la plus basique d'émettre des données issues de votre code
TypeScript.
Exemple1
3) afficher le contenue des variables dans le template du composant concerner.(en utilisant les
methodes)
2- Property binding
La liaison par propriété ou "property binding" est une autre façon de créer de la communication
dynamique entre votre TypeScript et votre template : plutôt qu'afficher simplement le contenu
d'une variable, vous pouvez modifier dynamiquement les propriétés d'un élément du DOM en
fonction de données dans votre TypeScript.
Exemple2
Pour votre application des appareils électriques, imaginez que si l'utilisateur est authentifié, on lui
laisse la possibilité d'allumer tous les appareils de la maison.
1) Puisque l'authentification est une valeur globale, ajoutez une variable "isAuth"
4)modifier le script de tel façon après un certain temps en seconde le bouton devient actif en
changent l'etat de la variable " isAuth"
3- Event binding
Avec le string interpolation et le property binding, vous savez communiquer depuis votre code
TypeScript vers le template HTML. le Event binding réagit dans votre code TypeScript aux
événements venant du template HTML.
Exemple3
le bouton ajouter sur votre template dans l'exemple2 s'active au bout de 4 secondes. Vous allez
maintenant lui ajouter une fonctionnalité liée à l'événement "click" (déclenché quand l'utilisateur
clique dessus).
4- Propriétés personnalisées
Il est possible de créer des propriétés personnalisées dans un component afin de pouvoir lui
transmettre des données depuis l'extérieur. Pour ce faire, il faut utiliser le décorateur
@Input().
Exemple4
chaque instance d' AppareilComponent ait un nom différent qu'on puisse régler depuis
l'extérieur du code.
1) importer Input depuis @angular/core
2) modifier la déclaration de la variable appareilName en utilisant le décodeur @Input().
3) creer les variables dans le composant principales ensuite lier ces variables au composant
appareil
correctionExemple1
correctionExemple2
correctionExemple3
correction exemple4
1MP IDM
Responsable:Olfa Jabri
FORMULAIRE
Institut Supérieur de
Gabes
Template-Driven Forms : souvent est la méthode la plus utilisée pour la création et la gestion
des formulaire.
A- Template-Driven Forms
On a un formulaire HTML et dans le background, Angular utilise sa propre collection “Form” qui
regroupe les valeurs des inputs dans le formulaire.
“ngForm”
Elle est utilisée dans la balise HTML <form ngForm=“...”></form> pour exporter les valeurs saisies
et les états “ngForm” des validateurs vers la partie background.
“ngModel”
Cette directive est utilisé à l'intérieur de la balise HTML <input ngModel=“”></input> .Elle est
utilisées pour exposer la valeur de cet input ou même autre control. Donc son rôle est
d’enregistrer ce champ en utilisant l’attribut “name”. “NgModel” permet aussi de définir comment
ce champ est exposé (OneWay, TwoWay).
2) ajouter le bootstrap
@Component({
selector: 'app-login-form',
templateUrl: './login-form.component.html',
styleUrls: ['./login-form.component.scss']
})
export class LoginFormComponent implements OnInit {
constructor() { }
ngOnInit(): void { }
onSubmit(form: NgForm) {
console.log(form.value);
}
}
<div class="row">
<div class="col-sm-8 col-sm-offset-2">
<form #f="ngForm" (ngSubmit)="onSubmit(f)" novalidate>
<div class="form-group">
<label for="name">
Nom de l'appareil
</label>
<input type="text" id="name" class="form-control" name="name" ngMode
l>
</div>
<div class="form-group">
<label for="status">
État de l'appareil
</label>
<select id="status" class="form-control" name="status" ngModel>
<option value="allumé">Allumé</option>
<option value="éteint">Éteint</option>
</select>
</div>
<button class="btn btn-primary" type="submit">Enregistrer</button>
</form>
</div>
</div>
exemple1
exemple 2
remarque :
exemple 3
defaultOnOff = 'éteint';
constructor() { }
Ainsi, le formulaire ne pourra être soumis que si le champ "Nom de l'appareil" n'est pas vide, et l'option
choisie par défaut empêche le deuxième champ d'être vide également.
Il ne reste plus qu'à exploiter ces données et en créer un nouvel appareil !
onSubmit(form: NgForm) {
}
Puisque vous savez que le formulaire comportera forcément un champ name et un champ status , vous
savez que vous pouvez utiliser cette syntaxe sans problème.
Créez maintenant la méthode dans AppareilService qui générera le nouvel appareil :
const appareilObject = {
id: 0,
name: '',
status: ''
};
appareilObject.name = name;
appareilObject.status = status;
this.appareils.push(appareilObject);
this.emitAppareilSubject();
}
Cette méthode crée un objet du bon format, et attribue le nom et le statut qui lui sont passés comme
arguments. La ligne pour l'id prend l'id du dernier élément actuel de l'array et ajoute 1. Ensuite, l'objet
complété est ajouté à l'array et le Subject est déclenché pour tout garder à jour.
Il ne reste plus qu'à intégrer cette fonction dans EditAppareilComponent . Il serait intéressant qu'une
fois l'appareil créé, l'utilisateur soit redirigé vers la liste des appareils. N'o
ubliez pas d'importer et d'injecter le router pour cela, ainsi qu' AppareilService :
1MP IDM
Responsable:Olfa Jabri
Routage
Institut Supérieur de
Gabes
La balise responsable de ce routage est <a href="…">. Lorsque l'on clique sur un lien HyperText,
le navigateur intercepte cette action et va charger la nouvelle page.
Dans un framework front-end résolument Javascript comme Angular, il n'est pas souhaitable
de perdre tout son contexte à chaque changement de page. Angular a donc besoin d'un système
de routage pour permettre la navigation à travers différentes pages de votre application.
Pour réaliser ce routage, Angular propose le module RouterModule disponible dans la librairie
@angular/router.
question 3
question4 app-routing.module.ts
question 5 app.module.ts
routingcomponents
question 6 app.component.html
<div style="text-align: center;">
<h1>routing et navigation</h1>
</div>
<router-outlet></router-outlet>
question 7