JSON vers HTML
Présenter des données JSON en HTML
Le but de l'exercice est de présenter des données JSON dans une page HTML en assurant une bonne structuration de la page. La finalité de cet exercice est de mettre en pratique les directives du module ng qu'on a vu en cours.
Les données représentent des tutoriels qui ont été présentés par des étudiants de l'UTC. On veut présenter ces données sous forme d'une liste. Chaque item contient des informations sur l'étudiant (le nom et le prénom de l'étudiant,le type , le titre et la date de la présentation ainsi que le nombre de "j'aime".
On souhaite aussi implémenter un système de vote pour évaluer l'ensemble des présentations en se basant sur le nombre de j'aime.
Ci-dessous, vous trouverez le code AngularJS qui permet de définir le contrôleur qui va s'occuper de passer les données JSON à la vue HTML.
Vous trouverez aussi la vue HTML qu'il faudra compléter pour arriver au résultat attendu.
// app.js
var app = angular.module('nf29', []); // notre module ne dépond d'aucun autre module
app.controller('CdtCtrl',['$scope', function($scope){
$scope.tutorials = [
{
"id": 1,
"isCDT" : true,
"prenom": "Merouane",
"nom": "Harriga",
"date": "01-02-2014",
"title": "AngularJs",
"tags": ["AngularJs", "HTML5","Javascript"],
"likeNumber" : 0
},
{
"id": 2,
"isCDT" : true,
"prenom": "Alex",
"nom": "Quilliec",
"date": "01-03-2014",
"title": "Scala",
"tags": ["JAVA", "REST","API"],
"likeNumber" : 0
},
{
"id": 3,
"isCDT" : true,
"prenom": "Anthony",
"nom": "Alfredo",
"date": "01-04-2014",
"title": "real time web apps",
"tags": ["nodeJS", "Redis","websocket"],
"likeNumber" : 0
},
{
"id": 4,
"isCDT" : false,
"prenom": "Fred",
"nom": "Alamy",
"date": "01-05-2014",
"title": "Numérical document",
"tags": ["tranformation", "transclusion","scenari"],
"likeNumber" : 0
},
];
$scope.thumbUp = function(...){
}
$scope.thumbDown = function(...){
}
}]);
Ci-dessous le fichier HTML sur lequel on va travailler
<html ng-app="nf29">
<head>
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body class="container">
<div ng-controller="CdtCtrl">
<!-- Q1 -->
<header>
<div class="container">
<div class="row">
<br>
<nav class="navbar navbar-default" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-admin">
<span class="sr-only"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand">Angular Js <span class="glyphicon glyphicon-stats"></span></a>
<p class="navbar-text" clickable>Cours NF29 ...</p>
</div>
<div class="collapse navbar-collapse" id="navbar-admin"></div>
</div>
</nav>
</div>
</div>
</header>
<div class="container">
<ul class="list-group" id="contact-list">
<!-- Q2 -->
<li ... class="list-group-item">
<div class="col-xs-12 col-sm-3">
<img src="https://uxcam.com/images/join-uxcam.png" alt="Glenda Patterson" class="img-responsive img-circle fixedWidth" />
</div>
<div class="col-xs-12 col-sm-9">
<span class="name"> nom prenom </span> <span> (Recommandé)</span><br/>
<span> date</span>
<hr />
<ul class="tags">
0.1 tag 1
0.2 tag 2
...
</ul>
</div>
<!-- Q3 Vote -->
<div class="row">
<div class="col-sm-3 col-md-3 col-lg-3">
<div class="input-group">
<span><button type="button" id="increaseButton" class="btn btn-success">+</button> </span>
<span class=""><button type="button" id="decreaseButton" class="btn btn-danger">-</button> </span>
<span class=""><button type="button" id="decreaseButton" class="btn btn-info"> 50 </button></span>
</div>
</div>
</div>
<div class="clearfix"></div>
</li>
</ul>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js"></script>
<script src="app.js"></script>
</body>
</html>
Vous pouvez télécharger l'atelier de l'exercice.
Question
Externaliser le Header de la page En utilisant la directive ng-include
<div ng-include="'header.html'"> </div>
Question
En utilisant la directive ng-repeat, lister les tutoriels et les tags associées.
Afficher la position des tags ainsi que la position de leurs père (position du père, position du tag)
Vous pouvez construire des boucles imbriqués avec ng-repeat.
la directive ng-repeat expose aussi ses propriétés aux directives ng-repeat fils via l'objet $parent
<li ng-repeat="tutorial in tutorials" class="list-group-item" >
<div class="col-xs-12 col-sm-3">
<img src="https://uxcam.com/images/join-uxcam.png" alt="Glenda Patterson" class="img-responsive img-circle fixedWidth" />
</div>
<div class="col-xs-12 col-sm-9">
<span class="name"> {{tutorial.nom}} {{...}}
</span> <span> (Recommandé)</span><br/>
<span> <i><strong>{{...}}</strong> </i> {{...}}</span>
<hr />
<ul class="tags">
<li ng-repeat="tag in tutorial.tags">
{{$parent...}}-{{...}}
</li>
</ul>
</div>
<div class="clearfix"></div>
</li>
<li ng-repeat="tutorial in tutorials" class="list-group-item" >
<div class="col-xs-12 col-sm-3">
<img src="https://uxcam.com/images/join-uxcam.png" alt="Glenda Patterson" class="img-responsive img-circle fixedWidth" />
</div>
<div class="col-xs-12 col-sm-9">
<span class="name"> {{tutorial.nom}} {{tutorial.prenom}} </span> <span> (Recommandé)</span><br/>
<span> <i><strong>{{tutorial.title}}</strong> </i> {{tutorial.date}}</span>
<hr />
<ul class="tags">
<li ng-repeat="tag in tutorial.tags">
{{$parent.$index}}-{{$index}} {{tag}}
</li>
</ul>
</div>
<div class="clearfix"></div>
</li>
Question
On veut réaliser un système simple de vote en utilisant la directive ng-click.
Si l'utilisateur clique sur le bouton vert(+), le nombre de "likeNumber" s'augmente par 1
Si l'utilisateur clique sur le bouton rouge(-), le nombre de "likeNumber" se diminue de 1
Sachez que vous pouvez passer des paramètres depuis la vue HTML à une fonction au sein du contrôleur.
<div class="input-group">
<span>
<button type="button" class="btn btn-success" ng-click="thumbsUp(...)"></button>
</span>
<span>
<button type="button" class="btn btn-danger" ng-click="thumbsDown(...)">-</button>
</span>
<span class=""><button type="button" class="btn btn-info"> {{...}} </button></span>
</div>
Les paramètres sont les tutoriels du premier ng-repeat
Notez bien qu'ils sont passés par référence.
Vous pouvez passer aussi comme paramètre tout ce qui est attaché au $scope depuis la vue. Si la chaîne de caractère (le paramètre) correspond à une propriété du $scopeAngularJS passe avec référence la propriété en question, sinon le paramètre sera indéfinie au sein de l'appelé.
...
<div class="input-group">
<span>
<button type="button" id="increaseButton" class="btn btn-success" ng-click="thumbsUp(tutorial)">+</button>
</span>
<span>
<button type="button" id="decreaseButton" class="btn btn-danger"ng-click="thumbsDown(tutorial)">-</button>
</span>
<span class="">
<button type="button" id="decreaseButton" class="btn btn-info"> {{tutorial.likeNumber}} </button>
</span>
</div>
..
...
$scope.thumbsUp = function(tutorial){
tutorial.likeNumber++;
}
$scope.thumbsDown = function(tutorial){
tutorial.likeNumber--;
}
...
Question
Vous pouvez télécharger la solution complète.