{"id":128,"date":"2021-03-12T10:36:29","date_gmt":"2021-03-12T10:36:29","guid":{"rendered":"https:\/\/kaay-coder.2sweb.sn\/kc\/?page_id=128"},"modified":"2022-04-03T01:16:39","modified_gmt":"2022-04-03T01:16:39","slug":"angular","status":"publish","type":"page","link":"https:\/\/kaay-coder.2sweb.sn\/kc\/angular\/","title":{"rendered":"Angular"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"128\" class=\"elementor elementor-128\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1ae704b elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"1ae704b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bf9b758\" data-id=\"bf9b758\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9233566 elementor-widget elementor-widget-image\" data-id=\"9233566\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"259\" src=\"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/angulart2_light_1200x303-1024x259.png\" class=\"attachment-large size-large wp-image-822\" alt=\"\" srcset=\"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/angulart2_light_1200x303-1024x259.png 1024w, https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/angulart2_light_1200x303-300x76.png 300w, https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/angulart2_light_1200x303-768x194.png 768w, https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/angulart2_light_1200x303.png 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b8380ba elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b8380ba\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-e2f8cac\" data-id=\"e2f8cac\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7c02691 elementor-widget elementor-widget-toggle\" data-id=\"7c02691\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"toggle.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-1301\" class=\"elementor-tab-title\" data-tab=\"1\" role=\"button\" aria-controls=\"elementor-tab-content-1301\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Qu'est ce que Angular ?<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1301\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"1\" role=\"region\" aria-labelledby=\"elementor-tab-title-1301\"><p><strong>Angular<\/strong>\u00a0est un\u00a0<strong>Framework<\/strong>\u00a0open source \u00e9crit en\u00a0<strong>JavaScript<\/strong>\u00a0qui permet la cr\u00e9ation d\u2019applications Web et plus particuli\u00e8rement de ce qu\u2019on appelle des \u00a0\u00ab\u00a0<em>Single Page Applications<\/em> \u00bb\u00a0: des applications web accessibles via une page web unique qui permet de fluidifier l\u2019exp\u00e9rience utilisateur et d\u2019\u00e9viter les chargements.<\/p><p><strong>D\u00e9velopp\u00e9 par Google<\/strong>, Angular est un\u00a0<strong>Framework<\/strong>\u00a0open source \u00e9crit en\u00a0<strong>JavaScript<\/strong>\u00a0qui permet la cr\u00e9ation d\u2019applications Web et plus particuli\u00e8rement de ce qu\u2019on appelle des \u00a0\u00ab\u00a0<em>Single Page Applications<\/em>\u00a0\u00bb\u00a0: des applications web accessibles via une page web unique qui permet de fluidifier l\u2019exp\u00e9rience utilisateur et d\u2019\u00e9viter les chargements de pages \u00e0 chaque nouvelle action. Le Framework est bas\u00e9 sur une architecture du type\u00a0<a href=\"https:\/\/openclassrooms.com\/fr\/courses\/4670706-adoptez-une-architecture-mvc-en-php\/4678736-comment-fonctionne-une-architecture-mvc\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>MVC<\/strong><\/a>\u00a0et permet donc de s\u00e9parer les donn\u00e9es, le visuel et les actions pour une meilleure gestion des responsabilit\u00e9s. Un type d\u2019architecture qui a largement fait ses preuves et qui permet une forte maintenabilit\u00e9 et une am\u00e9lioration du travail collaboratif.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-1302\" class=\"elementor-tab-title\" data-tab=\"2\" role=\"button\" aria-controls=\"elementor-tab-content-1302\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Pourquoi utiliser Angular  ?<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1302\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"2\" role=\"region\" aria-labelledby=\"elementor-tab-title-1302\"><p>Loin de moi l\u2019id\u00e9e de faire du pros\u00e9lytisme, ce n\u2019est pas mon genre et je n\u2019ai pas assez de recul et de connaissances sur les autres produits du march\u00e9 pour m\u2019aventurer l\u00e0-dedans, mais\u00a0<strong>je dois dire<\/strong>\u00a0<strong>qu\u2019Angular est un Framework solide, complet et homog\u00e8ne<\/strong>\u00a0qui a l\u2019avantage de ne pas n\u00e9cessiter l\u2019ajout de composants ext\u00e9rieurs pour son fonctionnement. Il est possible de faire nativement du routing, de l\u2019AJAX ou encore du stockage en local contrairement \u00e0\u00a0<strong>vue.js<\/strong>\u00a0ou encore\u00a0<strong>React<\/strong>\u00a0qui reste au final une librairie destin\u00e9e \u00e0 d\u00e9velopper des composants.<\/p><p>Aussi, le framework s\u2019appuie sur\u00a0<strong>Typescript<\/strong>, une surcouche au JavaScript d\u00e9velopp\u00e9 par\u00a0<strong>Microsoft<\/strong>, qui est un langage typ\u00e9 qui permet de cr\u00e9er des classes, des variables et des signatures de fonction. Et s\u2019il est parfaitement possible d\u2019utiliser du JavaScript natif avec Angular, l\u2019utilisation de Typescript permet de mieux g\u00e9rer les erreurs, d\u2019avoir un code plus clair et aussi d\u2019assurer une transition plus simple pour les d\u00e9veloppeurs PHP, Java ou encore\u00a0<strong>C#<\/strong>.<\/p><div class=\"google-auto-placed ap_container\">Enfin, si Angular permet de d\u00e9velopper des applications Web, il est \u00e9galement possible de faire des applications bureau ou encore des\u00a0<strong>Progressive Web App<\/strong>\u00a0en utilisant le m\u00eame code\u00a0! Ce qui permet donc par exemple de d\u00e9velopper un site web et une application mobile en m\u00eame temps sans avoir \u00e0 g\u00e9rer deux projets en parall\u00e8le. Ce qui est loin d\u2019\u00eatre anodin.<\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-1303\" class=\"elementor-tab-title\" data-tab=\"3\" role=\"button\" aria-controls=\"elementor-tab-content-1303\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">TypeScript & Angular\u00a0Pourquoi l\u2019utiliser ?<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1303\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"3\" role=\"region\" aria-labelledby=\"elementor-tab-title-1303\"><p>Pour faire bref, le TypeScript est un sur-ensemble (un \u201csuperset\u201d) de JavaScript qui est justement transcompil\u00e9 (transcompilation : &#8220;traduction&#8221; d&#8217;un langage de programmation vers un autre &#8211; diff\u00e9rent de la compilation, qui transforme g\u00e9n\u00e9ralement le code vers un format ex\u00e9cutable) en JavaScript pour \u00eatre compr\u00e9hensible par les navigateurs. Il ajoute des fonctionnalit\u00e9s extr\u00eamement utiles, comme, entre autres :<\/p><div class=\"foldable__content\"><ul id=\"r-5086915\" class=\"\" data-claire-element-id=\"9705547\"><li id=\"r-5086910\" data-claire-element-id=\"9705542\"><p id=\"r-5086909\" data-claire-element-id=\"9705541\">le typage strict, qui permet de s\u2019assurer qu\u2019une variable ou une valeur pass\u00e9e vers ou retourn\u00e9e par une fonction soit du type pr\u00e9vu ;<\/p><\/li><li id=\"r-5086912\" data-claire-element-id=\"9705544\"><p id=\"r-5086911\" data-claire-element-id=\"9705543\">les fonctions dites lambda ou arrow, permettant un code plus lisible et donc plus simple \u00e0 maintenir ;<\/p><\/li><li id=\"r-5086914\" data-claire-element-id=\"9705546\"><p id=\"r-5086913\" data-claire-element-id=\"9705545\">les classes et interfaces, permettant de coder de mani\u00e8re beaucoup plus modulaire et robuste.<\/p><\/li><\/ul><\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-1304\" class=\"elementor-tab-title\" data-tab=\"4\" role=\"button\" aria-controls=\"elementor-tab-content-1304\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Pr\u00e9parez l'environnement de travail<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1304\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"4\" role=\"region\" aria-labelledby=\"elementor-tab-title-1304\"><h4><strong>Qu\u2019est-ce que le CLI ?<\/strong><\/h4><p id=\"r-5086946\" class=\"\" data-claire-element-id=\"9705581\">Le CLI, ou \u201cCommand Line Interface\u201d (un outil permettant d&#8217;ex\u00e9cuter des commandes depuis la console), d\u2019Angular est l\u2019outil qui vous permet d\u2019ex\u00e9cuter des scripts pour la cr\u00e9ation, la structuration et la production d\u2019une application Angular.<\/p><h4 id=\"r-5140011\" class=\"hoveredCourseElement\" data-claire-element-id=\"9720054\">Installez les outils<\/h4><p id=\"r-5086953\" class=\"\" data-claire-element-id=\"9720042\">Vous\u00a0devez installer les outils suivants si vous ne les avez pas d\u00e9j\u00e0 sur votre machine :<\/p><p id=\"r-5086954\" class=\"\" data-claire-element-id=\"9564319\"><strong>NODE.JS<\/strong><br \/>T\u00e9l\u00e9chargez et installez la derni\u00e8re version LTS de Node.js ici :<\/p><pre data-claire-element-id=\"9564319\"><a href=\"https:\/\/nodejs.org\/en\/download\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\/\/nodejs.org\/en\/download\/<\/a><\/pre><p id=\"r-5086955\" class=\"\" data-claire-element-id=\"9564320\"><strong>NPM<\/strong><br \/>NPM est un package manager qui permet l\u2019installation d\u2019\u00e9norm\u00e9ment d\u2019outils et de libraries dont vous aurez besoin pour tout type de d\u00e9veloppement. \u00a0Pour l\u2019installer, ouvrez une ligne de commande et tapez la commande suivante :<\/p><pre class=\"foldable__content\"><samp>npm install -g npm@latest<\/samp><\/pre><aside id=\"r-5140982\" class=\"\" data-claire-element-id=\"9720053\" data-claire-semantic=\"warning\"><p id=\"r-5140981\" data-claire-element-id=\"9720052\">Si la commande \u00e9choue pour un probl\u00e8me de permission sur Mac ou Linux, vous pouvez la\u00a0<a href=\"https:\/\/openclassrooms.com\/courses\/reprenez-le-controle-a-l-aide-de-linux\/les-utilisateurs-et-les-droits#\/id\/r-38733\">lancer en mode super-utilisateur\u00a0<\/a>avec\u00a0<em>sudo<\/em>\u00a0ou\u00a0<a href=\"https:\/\/docs.npmjs.com\/getting-started\/fixing-npm-permissions\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">consulter la documentation suivante<\/a>.<\/p><\/aside><p id=\"r-5086957\" class=\"\" data-claire-element-id=\"9705631\"><strong>ANGULAR\/CLI<br \/><\/strong>Vous allez maintenant installer le CLI d\u2019Angular de mani\u00e8re globale sur votre machine avec la commande suivante (avec sudo si besoin) :<\/p><pre id=\"r-5087110\" class=\"\" data-claire-element-id=\"9564786\"><samp>npm install -g @angular\/cli<\/samp><\/pre><p id=\"r-5086959\" class=\"\" data-claire-element-id=\"9564324\">\u00c0 partir de l\u00e0, la commande \u00a0<code data-claire-semantic=\"text\">ng<\/code>\u00a0 est disponible depuis la ligne de commandes depuis n\u2019importe quel dossier de l\u2019ordinateur.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-1305\" class=\"elementor-tab-title\" data-tab=\"5\" role=\"button\" aria-controls=\"elementor-tab-content-1305\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Cr\u00e9ez votre premier projet<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1305\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"5\" role=\"region\" aria-labelledby=\"elementor-tab-title-1305\"><p>Pour cr\u00e9er un nouveau projet Angular, naviguez vers le dossier souhait\u00e9 depuis une ligne de commande et saisissez la commande suivante :<\/p><div class=\"foldable__content\"><pre id=\"r-5140006\" class=\"\" data-claire-element-id=\"9705147\"><samp>ng new mon-premier-projet<\/samp><\/pre><p id=\"r-5140007\" class=\"\" data-claire-element-id=\"9705148\">Ensuite, naviguez dans le dossier du projet et lancez le serveur de d\u00e9veloppement :<\/p><pre id=\"r-5140008\" class=\"\" data-claire-element-id=\"9720102\"><samp>cd mon-premier-projet\nng serve --open\n<\/samp><\/pre><p id=\"r-5140009\" class=\"\" data-claire-element-id=\"9705175\">Si tout se passe bien, vous verrez les informations du serveur qui se lance \u00e0 l&#8217;adresse\u00a0<em>localhost:4200<\/em>\u00a0et votre navigateur pr\u00e9f\u00e9r\u00e9 se lancera automatiquement avec le message &#8220;Welcome to app!!&#8221; et le logo Angular.<\/p><p id=\"r-5140010\" class=\"hoveredCourseElement\" data-claire-element-id=\"9705151\">F\u00e9licitations, votre environnement de d\u00e9veloppement est pr\u00eat !<\/p><\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-1306\" class=\"elementor-tab-title\" data-tab=\"6\" role=\"button\" aria-controls=\"elementor-tab-content-1306\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Structurez avec les components<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1306\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"6\" role=\"region\" aria-labelledby=\"elementor-tab-title-1306\"><h4 id=\"r-5141367\" class=\"foldable__button secondTitle js-foldable-button hoveredCourseElement\" data-claire-element-id=\"10839623\">Pr\u00e9parez le projet<i class=\"foldable__icon icon-next\"><\/i><\/h4><div class=\"foldable__content\"><p id=\"r-5087051\" class=\"\" data-claire-element-id=\"9720112\">Tout d&#8217;abord, cr\u00e9ez un nouveau projet sur lequel vous travaillerez tout au long des chapitres suivants. \u00a0Depuis une ligne de commandes, naviguez vers votre dossier cible et tapez la commande suivante :<\/p><p id=\"r-5087052\" class=\"\" data-claire-element-id=\"9705811\"><code data-claire-semantic=\"text\">ng new mon-projet-angular --style=scss --skip-tests=true<\/code>.<\/p><p class=\"\" data-claire-element-id=\"9705812\">Le premier flag (\u00e9l\u00e9ment de la commande suivant un double tiret &#8211;) cr\u00e9e des fichiers \u00a0<code data-claire-semantic=\"text\">.scss<\/code>\u00a0 pour les styles plut\u00f4t que des fichiers \u00a0<code data-claire-semantic=\"text\">.css<\/code> . \u00a0Le second flag annule la cr\u00e9ation des fichiers test. Maintenant vous pouvez ouvrir le dossier \u00a0<code data-claire-semantic=\"text\">mon-projet-angular<\/code>\u00a0 depuis votre \u00e9diteur. Avant de plonger dans les diff\u00e9rents dossiers, vous allez ex\u00e9cuter une commande pour installer Bootstrap dans votre projet. \u00a0Depuis le dossier \u00a0<code data-claire-semantic=\"text\">mon-projet-angular<\/code>\u00a0, avec une ligne de commande, tapez :<\/p><pre id=\"r-5087057\" data-claire-element-id=\"9705816\"><code data-claire-semantic=\"text\">npm install bootstrap@3.3.7 --save<\/code>.<\/pre><\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-1307\" class=\"elementor-tab-title\" data-tab=\"7\" role=\"button\" aria-controls=\"elementor-tab-content-1307\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">La structure des components d'une application Angular<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1307\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"7\" role=\"region\" aria-labelledby=\"elementor-tab-title-1307\"><p>Les components sont les composantes de base d&#8217;une application Angular : une application est une arborescence de plusieurs components.<\/p><div class=\"foldable__content\"><p id=\"r-5087077\" class=\"\" data-claire-element-id=\"9564692\">Imaginez la page web suivante :<\/p><figure id=\"r-5087080\" class=\"\" data-claire-element-id=\"30982943\"><img decoding=\"async\" id=\"r-5087078\" src=\"https:\/\/user.oc-static.com\/upload\/2018\/02\/23\/1519384317693_Screen%20Shot%202018-02-23%20at%2012.11.04.png\" alt=\"Exemple de page web\" data-claire-element-id=\"9564693\" \/><\/figure><p id=\"r-5087081\" data-claire-element-id=\"9564696\">Tout d&#8217;abord, notre \u00a0<code data-claire-semantic=\"text\">AppComponent<\/code>\u00a0 est notre component principal : tous les autres components de notre application seront embo\u00eet\u00e9s ou &#8220;nested&#8221; dans celui-ci.<\/p><p id=\"r-5087082\" class=\"hoveredCourseElement\" data-claire-element-id=\"9705821\">Pour cette structure, on peut imaginer un component pour la barre de menu, un autre pour la partie contenu et un dernier pour le menu \u00e0 droite. \u00a0Il n&#8217;y a pas de r\u00e8gle d&#8217;or : je vous montrerai au cours des chapitres suivants comment r\u00e9fl\u00e9chir \u00e0 votre structure afin de trouver la s\u00e9paration des components la plus pertinente.<\/p><\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-1308\" class=\"elementor-tab-title\" data-tab=\"8\" role=\"button\" aria-controls=\"elementor-tab-content-1308\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Cr\u00e9ez un component<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1308\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"8\" role=\"region\" aria-labelledby=\"elementor-tab-title-1308\"><p>Vous allez maintenant cr\u00e9er un nouveau component \u00e0 l&#8217;aide du CLI d&#8217;Angular. \u00a0Depuis le dossier principal de votre projet, tapez la commande suivante :<\/p><div class=\"foldable__content\"><pre id=\"r-5087208\" class=\"\" data-claire-element-id=\"9564957\"><samp>ng generate component mon-premier \n<\/samp><\/pre><p id=\"r-5087210\" class=\"\" data-claire-element-id=\"9564959\"><img decoding=\"async\" id=\"r-5087209\" src=\"https:\/\/user.oc-static.com\/upload\/2018\/02\/23\/15193852953372_Screen%20Shot%202018-02-23%20at%2012.27.53.png\" alt=\"\" data-claire-element-id=\"9564958\" \/><\/p><p id=\"r-5087211\" class=\"hoveredCourseElement\" data-claire-element-id=\"9564960\">Comme vous le constaterez, le CLI a cr\u00e9\u00e9 un nouveau sous-dossier \u00a0<code data-claire-semantic=\"text\">mon-premier<\/code>\u00a0 et y a cr\u00e9\u00e9 un fichier template, une feuille de styles, un fichier component et un fichier spec : il s&#8217;agit d&#8217;un fichier de test que vous pouvez supprimer, car vous ne vous en servirez pas dans le cadre de ce cours.<\/p><\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-1309\" class=\"elementor-tab-title\" data-tab=\"9\" role=\"button\" aria-controls=\"elementor-tab-content-1309\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Data binding<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1309\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"9\" role=\"region\" aria-labelledby=\"elementor-tab-title-1309\"><p id=\"r-5088297\" class=\"\" data-claire-element-id=\"9567742\">Le databinding, c&#8217;est la communication entre votre code TypeScript et le template HTML qui est montr\u00e9 \u00e0 l&#8217;utilisateur. \u00a0Cette communication est divis\u00e9e en deux directions :<\/p><ul id=\"r-5088320\" class=\"\" data-claire-element-id=\"9706453\"><li id=\"r-5088317\" data-claire-element-id=\"9706452\"><p id=\"r-5088316\" data-claire-element-id=\"9706451\">les informations venant de votre code qui doivent \u00eatre affich\u00e9es dans le navigateur, comme par exemple des informations que votre code a calcul\u00e9 ou r\u00e9cup\u00e9r\u00e9 sur un serveur. \u00a0Les deux principales m\u00e9thodes pour cela sont le &#8220;string interpolation&#8221; et le &#8220;property binding&#8221; ;<\/p><\/li><li id=\"r-5088319\" data-claire-element-id=\"9567834\"><p id=\"r-5088318\" data-claire-element-id=\"9567833\">les informations venant du template qui doivent \u00eatre g\u00e9r\u00e9es par le code : l&#8217;utilisateur a rempli un formulaire ou cliqu\u00e9 sur un bouton, et il faut r\u00e9agir et g\u00e9rer ces \u00e9v\u00e9nements. \u00a0On parlera de &#8220;event binding&#8221; pour cela.<\/p><\/li><\/ul><p id=\"r-5088321\" class=\"hoveredCourseElement\" data-claire-element-id=\"9706454\">Il existe \u00e9galement des situations comme les formulaires, par exemple, o\u00f9 l&#8217;on voudra une communication \u00e0 double sens : on parle donc de &#8220;two-way binding&#8221;.<\/p><p class=\"\" data-claire-element-id=\"9568075\">Pour votre application des appareils \u00e9lectriques, imaginez que si l&#8217;utilisateur est authentifi\u00e9, on lui laisse la possibilit\u00e9 d&#8217;allumer tous les appareils de la maison. \u00a0Puisque l&#8217;authentification est une valeur globale, ajoutez une variable boolean dans \u00a0<code data-claire-semantic=\"text\">AppComponent<\/code>\u00a0, votre component de base (vous pouvez supprimer la variable \u00a0<code data-claire-semantic=\"text\">title<\/code>\u00a0 puisque vous ne l&#8217;utilisez plus) :<span class=\"ace_keyword\">import<\/span> <span class=\"ace_paren ace_lparen\">{<\/span> <span class=\"ace_identifier\">Component<\/span> <span class=\"ace_paren ace_rparen\">}<\/span> <span class=\"ace_keyword\">from<\/span> <span class=\"ace_string\">&#8216;@angular\/core&#8217;<\/span><span class=\"ace_punctuation ace_operator\">;<\/span><\/p><div class=\"ace-openclassrooms\"><div class=\"ace_static_highlight ace_show_gutter\"><pre class=\"ace_line\">@<span class=\"ace_identifier\">Component<\/span><span class=\"ace_paren ace_lparen\">({<\/span><br \/><span class=\"ace_identifier\">     selector<\/span><span class=\"ace_punctuation ace_operator\">:<\/span> <span class=\"ace_string\">'app-root'<\/span><span class=\"ace_punctuation ace_operator\">,<\/span><br \/><span class=\"ace_identifier\">     templateUrl<\/span><span class=\"ace_punctuation ace_operator\">:<\/span> <span class=\"ace_string\">'.\/app.component.html'<\/span><span class=\"ace_punctuation ace_operator\">,<\/span><br \/><span class=\"ace_identifier\">     styleUrls<\/span><span class=\"ace_punctuation ace_operator\">:<\/span> <span class=\"ace_paren ace_lparen\">[<\/span><span class=\"ace_string\">'.\/app.component.scss'<\/span><span class=\"ace_paren ace_rparen\">]<\/span><br \/><span class=\"ace_paren ace_rparen\">    })<\/span><br \/><span class=\"ace_keyword\">  export<\/span> <span class=\"ace_keyword\">class<\/span> <span class=\"ace_identifier\">AppComponent<\/span> <span class=\"ace_paren ace_lparen\">{<\/span><br \/><span class=\"ace_identifier\"> isAuth<\/span> <span class=\"ace_keyword ace_operator\">=<\/span> <span class=\"ace_constant ace_language ace_boolean\">false<\/span><span class=\"ace_punctuation ace_operator\">;<\/span><br \/><span class=\"ace_paren ace_rparen\">}<\/span><\/pre><\/div><\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-13010\" class=\"elementor-tab-title\" data-tab=\"10\" role=\"button\" aria-controls=\"elementor-tab-content-13010\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Les Directives<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-13010\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"10\" role=\"region\" aria-labelledby=\"elementor-tab-title-13010\"><div class=\"contentWithSidebar__content\">\n<div class=\"relative js-sidebar-container\">\n<div class=\"static\">\n<p class=\"part-title\" data-part-title=\"Structurez le document avec des Directives\"><span style=\"font-size: 16px;\">Les directives sont des instructions int\u00e9gr\u00e9es dans le DOM que vous utiliserez presque syst\u00e9matiquement quand vous cr\u00e9erez des applications Angular.\u00a0 Quand Angular lit votre template et rencontre une directive qu&#8217;il reconnait, il suit les instructions correspondantes.\u00a0\u00a0<\/span><\/p>\n\n<section class=\"space-bottom js-desktop-sticky-container\">\n<div class=\"js-isRestrictablePage js-course-container js-smilize js-userCanWatchVideo\" data-page-indentifier=\"\/fr\/courses\/4668271-developpez-des-applications-web-avec-angular\/5088481-structurez-le-document-avec-des-directives\">\n<div class=\"userContent js-userContent\">\n<p id=\"r-5088487\" class=\"\" data-claire-element-id=\"9568352\">Il existe deux types principaux de directive : les directives structurelles et les directives par attribut.<\/p>\n\n<div id=\"ui-id-1\" class=\"foldable\" data-widget=\"foldable\">\n<h3 id=\"r-5088513\" class=\"foldable__button secondTitle js-foldable-button\" data-claire-element-id=\"9706649\">Les directives structurelles<i class=\"foldable__icon icon-next\"><\/i><\/h3>\n<div class=\"foldable__content\">\n<p id=\"r-5088496\" class=\"\" data-claire-element-id=\"9706642\">Ce sont des directives qui, comme leur nom l&#8217;indique, modifient la structure du document. \u00a0Dans ce chapitre, vous allez en d\u00e9couvrir deux (il en existe d&#8217;autres) : \u00a0<code data-claire-semantic=\"text\">*ngIf<\/code>\u00a0 , pour afficher des donn\u00e9es de fa\u00e7on conditionnelle, et \u00a0<code data-claire-semantic=\"text\">*ngFor<\/code>\u00a0, pour it\u00e9rer des donn\u00e9es dans un array, par exemple.<\/p>\n\n<h4 id=\"r-5088502\" class=\"\" data-claire-element-id=\"9706644\">*ngIf<\/h4>\n<p id=\"r-5088497\" data-claire-element-id=\"9706643\">Un component auquel on ajoute la directive \u00a0<code data-claire-semantic=\"text\">*ngIf=\"condition\"<\/code>\u00a0 ne s&#8217;affichera que si la condition est &#8220;truthy&#8221; (elle retourne la valeur \u00a0<code data-claire-semantic=\"text\">true<\/code>\u00a0 o\u00f9 la variable mentionn\u00e9e est d\u00e9finie et non-nulle), comme un statement \u00a0<code data-claire-semantic=\"text\">if<\/code>\u00a0 classique.<\/p>\n<p id=\"r-5088498\" data-claire-element-id=\"9568393\">Pour une d\u00e9monstration simple, ajoutez une \u00a0<code data-claire-semantic=\"text\">&lt;div&gt;<\/code>\u00a0 rouge qui ne s&#8217;affichera que si l&#8217;appareil est \u00e9teint :<\/p>\n\n<pre class=\"code-block\" data-claire-element-id=\"9568394\"><code class=\"ace\" data-claire-semantic=\"html\" data-code=\"{&quot;language&quot;:&quot;html&quot;,&quot;source&quot;:&quot;&amp;#x3C;li class=&amp;#x22;list-group-item&amp;#x22;&amp;#x3E;\\n  &amp;#x3C;div style=&amp;#x22;width:20px;height:20px;background-color:red;&amp;#x22; \\n       *ngIf=&amp;#x22;appareilStatus === &amp;#x27;&amp;#xE9;teint&amp;#x27;&amp;#x22;&amp;#x3E;&amp;#x3C;\/div&amp;#x3E;\\n  &amp;#x3C;h4&amp;#x3E;Appareil : {{ appareilName }} -- Statut : {{ getStatus() }}&amp;#x3C;\/h4&amp;#x3E;\\n  &amp;#x3C;input type=&amp;#x22;text&amp;#x22; class=&amp;#x22;form-control&amp;#x22; [(ngModel)]=&amp;#x22;appareilName&amp;#x22;&amp;#x3E;\\n&amp;#x3C;\/li&amp;#x3E;&quot;}\" data-widget=\"codeBlock\"><\/code><\/pre>\n<div class=\"ace-openclassrooms\">\n<div class=\"ace_static_highlight ace_show_gutter\">\n<pre class=\"ace_line\"><span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">li<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">class<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"list-group-item\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">div<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">style<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"width:20px;height:20px;background-color:red;\"<\/span>\n*<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">ngIf<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"appareilStatus === '\u00e9teint'\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">div<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">h4<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><span class=\"ace_text ace_xml\">Appareil : {{ appareilName }} -- Statut : {{ getStatus() }}<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">h4<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_form ace_tag-name ace_xml\">input<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">type<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"text\"<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">class<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"form-control\"<\/span> [(<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">ngModel<\/span>)]<span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"appareilName\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">li<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><\/pre>\n<\/div>\n<\/div>\n<h4 id=\"r-5088512\" data-claire-element-id=\"9706648\">*ngFor<\/h4>\n<p id=\"r-5088503\" data-claire-element-id=\"9706645\">Lorsque l&#8217;on ajoute la directive \u00a0<code data-claire-semantic=\"text\">*ngFor=\"let obj of myArray\"<\/code>\u00a0 \u00e0 un component, Angular it\u00e9rera l&#8217;array \u00a0<code data-claire-semantic=\"text\">myArray<\/code>\u00a0 et affichera un component par objet \u00a0<code data-claire-semantic=\"text\">obj<\/code>\u00a0. \u00a0Pour en comprendre l&#8217;utilisation, je vous propose de modifier la fa\u00e7on dont votre application g\u00e9n\u00e8re des appareils \u00e9lectriques.<\/p>\n<p id=\"r-5088504\" data-claire-element-id=\"9568399\">On peut imaginer que votre application r\u00e9cup\u00e8re, depuis un serveur, un array contenant tous les appareils et leurs \u00e9tats.\u00a0 Pour l&#8217;instant, cr\u00e9ez cet array directement dans \u00a0<code data-claire-semantic=\"text\">AppComponent<\/code>\u00a0 :<\/p>\n\n<pre data-claire-element-id=\"9568399\"><span class=\"ace_keyword ace_operator ace_ts\">export<\/span> <span class=\"ace_keyword ace_operator ace_ts\">class<\/span> <span class=\"ace_identifier\">AppComponent<\/span> <span class=\"ace_paren ace_lparen\">{<\/span><\/pre>\n<div class=\"ace-openclassrooms\">\n<div class=\"ace_static_highlight ace_show_gutter\">\n<pre class=\"ace_line\"><span class=\"ace_identifier\">isAuth<\/span> <span class=\"ace_keyword ace_operator\">=<\/span> <span class=\"ace_constant ace_language ace_boolean\">false<\/span><span class=\"ace_punctuation ace_operator\">;<\/span>\n<span class=\"ace_identifier\">appareils<\/span> <span class=\"ace_keyword ace_operator\">=<\/span> <span class=\"ace_paren ace_lparen\">[<\/span>\n<span class=\"ace_paren ace_lparen\">{<\/span>\n<span class=\"ace_identifier\">name<\/span><span class=\"ace_punctuation ace_operator\">:<\/span> <span class=\"ace_string\">'Machine \u00e0 laver'<\/span><span class=\"ace_punctuation ace_operator\">,<\/span>\n<span class=\"ace_identifier\">status<\/span><span class=\"ace_punctuation ace_operator\">:<\/span> <span class=\"ace_string\">'\u00e9teint'<\/span>\n<span class=\"ace_paren ace_rparen\">}<\/span><span class=\"ace_punctuation ace_operator\">,<\/span>\n<span class=\"ace_paren ace_lparen\">{<\/span>\n<span class=\"ace_identifier\">name<\/span><span class=\"ace_punctuation ace_operator\">:<\/span> <span class=\"ace_string\">'Frigo'<\/span><span class=\"ace_punctuation ace_operator\">,<\/span>\n<span class=\"ace_identifier\">status<\/span><span class=\"ace_punctuation ace_operator\">:<\/span> <span class=\"ace_string\">'allum\u00e9'<\/span>\n<span class=\"ace_paren ace_rparen\">}<\/span><span class=\"ace_punctuation ace_operator\">,<\/span>\n<span class=\"ace_paren ace_lparen\">{<\/span>\n<span class=\"ace_identifier\">name<\/span><span class=\"ace_punctuation ace_operator\">:<\/span> <span class=\"ace_string\">'Ordinateur'<\/span><span class=\"ace_punctuation ace_operator\">,<\/span>\n<span class=\"ace_identifier\">status<\/span><span class=\"ace_punctuation ace_operator\">:<\/span> <span class=\"ace_string\">'\u00e9teint'<\/span>\n<span class=\"ace_paren ace_rparen\">}<\/span>\n<span class=\"ace_paren ace_rparen\">]<\/span><span class=\"ace_punctuation ace_operator\">;<\/span><\/pre>\n<\/div>\n<\/div>\n<p id=\"r-5088506\" data-claire-element-id=\"9706646\">Vous avez un array avec trois objets, chaque objet ayant une propri\u00e9t\u00e9 \u00a0<code data-claire-semantic=\"text\">name<\/code>\u00a0 et une propri\u00e9t\u00e9 \u00a0<code data-claire-semantic=\"text\">status<\/code>\u00a0. \u00a0Vous pourriez m\u00eame cr\u00e9er une interface ou une class TypeScript \u00a0<code data-claire-semantic=\"text\">Appareil<\/code>\u00a0, mais dans ce cas simple ce n&#8217;est pas n\u00e9cessaire.<\/p>\n<p id=\"r-5088507\" data-claire-element-id=\"9568402\">Maintenant la magie \u00a0<code data-claire-semantic=\"text\">*ngFor<\/code>\u00a0 :<\/p>\n\n<pre data-claire-element-id=\"9568402\"><span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">div<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">class<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"container\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><\/pre>\n<div class=\"ace-openclassrooms\">\n<div class=\"ace_static_highlight ace_show_gutter\">\n<pre class=\"ace_line\"><span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">div<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">class<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"row\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">div<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">class<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"col-xs-12\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">h2<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><span class=\"ace_text ace_xml\">Mes appareils<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">h2<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">ul<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">class<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"list-group\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">app-appareil<\/span> *<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">ngFor<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"let appareil of appareils\"<\/span>\n[<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">appareilName<\/span>]<span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"appareil.name\"<\/span>\n[<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">appareilStatus<\/span>]<span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"appareil.status\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">app-appareil<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">ul<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_form ace_tag-name ace_xml\">button<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">class<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"btn btn-success\"<\/span>\n[<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">disabled<\/span>]<span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"!isAuth\"<\/span>\n(<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">click<\/span>)<span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"onAllumer()\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><span class=\"ace_text ace_xml\">Tout allumer<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_form ace_tag-name ace_xml\">button<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">div<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">div<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">div<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><\/pre>\n<p class=\"ace_line\">Le statement \u00a0<code data-claire-semantic=\"text\">let appareil of appareils<\/code><span style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;\">\u00a0, comme dans une for loop classique, it\u00e8re pour chaque \u00e9l\u00e9ment \u00a0<\/span><code data-claire-semantic=\"text\">appareil<\/code><span style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;\">\u00a0 (nom arbitraire) de l&#8217;array \u00a0<\/span><code data-claire-semantic=\"text\">appareils<\/code><span style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;\">\u00a0 . \u00a0Apr\u00e8s cette directive, vous pouvez maintenant utiliser l&#8217;objet \u00a0<\/span><code data-claire-semantic=\"text\">appareil<\/code><span style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;\">\u00a0, dont vous connaissez la forme, \u00e0 l&#8217;int\u00e9rieur de cette balise HTML. \u00a0Vous pouvez donc utiliser le property binding, et y passer les propri\u00e9t\u00e9s \u00a0<\/span><code data-claire-semantic=\"text\">name<\/code><span style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;\">\u00a0 et \u00a0<\/span><code data-claire-semantic=\"text\">status<\/code><span style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;\">\u00a0 de cet objet.<\/span><\/p>\n\n<\/div>\n<\/div>\n<aside id=\"r-5088511\" data-claire-element-id=\"9568406\" data-claire-semantic=\"warning\">\n<p id=\"r-5088510\" data-claire-element-id=\"9568405\">N&#8217;oubliez pas l&#8217;ast\u00e9risque devant ces directives, qui signifie \u00e0 Angular de les traiter comme directives structurelles !<\/p>\n\n<\/aside><\/div>\n<\/div>\n<div id=\"ui-id-2\" class=\"foldable\" data-widget=\"foldable\">\n<h3 id=\"r-5088528\" class=\"foldable__button secondTitle js-foldable-button\" data-claire-element-id=\"9706674\">Les directives par attribut<i class=\"foldable__icon icon-next\"><\/i><\/h3>\n<div class=\"foldable__content\">\n<p id=\"r-5088514\" data-claire-element-id=\"9706650\">\u00c0 la diff\u00e9rence des directives structurelles, les directives par attribut modifient le comportement d&#8217;un objet d\u00e9j\u00e0 existant. \u00a0Vous avez d\u00e9j\u00e0 utilis\u00e9 une directive de ce type sans le savoir : la directive \u00a0<code data-claire-semantic=\"text\">ngModel<\/code>\u00a0 que vous avez employ\u00e9e pour le two-way binding, qui modifie la valeur du \u00a0<code data-claire-semantic=\"text\">&lt;input&gt;<\/code>\u00a0 et r\u00e9pond \u00e0 tout changement qu&#8217;on lui apporte. \u00a0Je vais vous montrer deux autres exemples tr\u00e8s utiles : \u00a0<code data-claire-semantic=\"text\">ngStyle<\/code>\u00a0 et \u00a0<code data-claire-semantic=\"text\">ngClass<\/code>\u00a0, qui permettent d&#8217;attribuer des styles ou des classes de mani\u00e8re dynamique.<\/p>\n\n<h4 id=\"r-5088520\" data-claire-element-id=\"9706654\">ngStyle<\/h4>\n<p id=\"r-5088515\" data-claire-element-id=\"9706651\">Cette directive permet d&#8217;appliquer des styles \u00e0 un objet du DOM de mani\u00e8re dynamique. Imaginez que, pour l&#8217;application des appareils \u00e9lectriques, vous souhaitiez modifier la couleur du texte selon si l&#8217;appareil est allum\u00e9 ou non, disons vert pour allum\u00e9, rouge pour \u00e9teint.\u00a0 \u00a0<code data-claire-semantic=\"text\">ngStyle<\/code>\u00a0 vous permet de faire cela :<\/p>\n\n<pre class=\"code-block\" data-claire-element-id=\"9568411\"><code class=\"ace\" data-claire-semantic=\"html\" data-code=\"{&quot;language&quot;:&quot;html&quot;,&quot;source&quot;:&quot;&amp;#x3C;h4 [ngStyle]=&amp;#x22;{color: getColor()}&amp;#x22;&amp;#x3E;Appareil : {{ appareilName }} -- Statut : {{ getStatus() }}&amp;#x3C;\/h4&amp;#x3E;&quot;}\" data-widget=\"codeBlock\"><\/code><\/pre>\n<div class=\"ace-openclassrooms\">\n<div class=\"ace_static_highlight ace_show_gutter\">\n<div class=\"ace_line\"><span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">h4<\/span> [<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">ngStyle<\/span>]<span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">&#8220;{color: getColor()}&#8221;<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><span class=\"ace_text ace_xml\">Appareil : {{ appareilName }} &#8212; Statut : {{ getStatus() }}<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">h4<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><\/div>\n<\/div>\n<\/div>\n<pre id=\"r-5088516\" class=\"code-block\" data-claire-element-id=\"9568411\"><code class=\"ace\" data-claire-semantic=\"html\" data-code=\"{&quot;language&quot;:&quot;html&quot;,&quot;source&quot;:&quot;&amp;#x3C;h4 [ngStyle]=&amp;#x22;{color: getColor()}&amp;#x22;&amp;#x3E;Appareil : {{ appareilName }} -- Statut : {{ getStatus() }}&amp;#x3C;\/h4&amp;#x3E;&quot;}\" data-widget=\"codeBlock\"><\/code><\/pre>\n<p id=\"r-5088517\" data-claire-element-id=\"9706652\"><code data-claire-semantic=\"text\">ngStyle<\/code>\u00a0 prend un objet JS de type cl\u00e9-valeur, avec comme cl\u00e9 le style \u00e0 modifier, et comme valeur la valeur souhait\u00e9e pour ce style. Ici, vous faites appel \u00e0 une fonction\u00a0<code data-claire-semantic=\"text\">getColor()<\/code>\u00a0 dans \u00a0<code data-claire-semantic=\"text\">AppareilComponent<\/code>\u00a0 que vous allez maintenant cr\u00e9er :<\/p>\n\n<pre class=\"code-block\" data-claire-element-id=\"9568413\"><code class=\"ace\" data-claire-semantic=\"typescript\" data-code=\"{&quot;language&quot;:&quot;typescript&quot;,&quot;source&quot;:&quot;getColor() {\\n    if(this.appareilStatus === &amp;#x27;allum&amp;#xE9;&amp;#x27;) {\\n      return &amp;#x27;green&amp;#x27;;\\n    } else if(this.appareilStatus === &amp;#x27;&amp;#xE9;teint&amp;#x27;) {\\n      return &amp;#x27;red&amp;#x27;;\\n    }\\n}&quot;}\" data-widget=\"codeBlock\"><\/code><\/pre>\n<div class=\"ace-openclassrooms\">\n<div class=\"ace_static_highlight ace_show_gutter\">\n<pre class=\"ace_line\"><span class=\"ace_entity ace_name ace_function ace_ts\">getColor<\/span><span class=\"ace_paren ace_lparen\">(<\/span><span class=\"ace_paren ace_rparen\">)<\/span> <span class=\"ace_paren ace_lparen\">{<\/span>\n<span class=\"ace_keyword\">if<\/span><span class=\"ace_paren ace_lparen\">(<\/span><span class=\"ace_storage ace_type ace_variable ace_ts\">this.<\/span><span class=\"ace_identifier\">appareilStatus<\/span> <span class=\"ace_keyword ace_operator\">===<\/span> <span class=\"ace_string\">'allum\u00e9'<\/span><span class=\"ace_paren ace_rparen\">)<\/span> <span class=\"ace_paren ace_lparen\">{<\/span>\n<span class=\"ace_keyword\">return<\/span> <span class=\"ace_string\">'green'<\/span><span class=\"ace_punctuation ace_operator\">;<\/span>\n<span class=\"ace_paren ace_rparen\">}<\/span> <span class=\"ace_keyword\">else<\/span> <span class=\"ace_keyword\">if<\/span><span class=\"ace_paren ace_lparen\">(<\/span><span class=\"ace_storage ace_type ace_variable ace_ts\">this.<\/span><span class=\"ace_identifier\">appareilStatus<\/span> <span class=\"ace_keyword ace_operator\">===<\/span> <span class=\"ace_string\">'\u00e9teint'<\/span><span class=\"ace_paren ace_rparen\">)<\/span> <span class=\"ace_paren ace_lparen\">{<\/span>\n<span class=\"ace_keyword\">return<\/span> <span class=\"ace_string\">'red'<\/span><span class=\"ace_punctuation ace_operator\">;<\/span>\n<span class=\"ace_paren ace_rparen\">}<\/span>\n<span class=\"ace_paren ace_rparen\">}<\/span><\/pre>\n<div><\/div>\n<div class=\"ace_line\">Cette fonction retourne la valeur \u00a0<code data-claire-semantic=\"text\">'green'<\/code>\u00a0 si l&#8217;appareil est allum\u00e9, et \u00a0<code data-claire-semantic=\"text\">'red'<\/code>\u00a0 s&#8217;il est \u00e9teint, modifiant ainsi la couleur du texte dans le template.<\/div>\n<\/div>\n<\/div>\n<h4 id=\"r-5088527\" data-claire-element-id=\"9706673\">ngClass<\/h4>\n<p id=\"r-5088521\" data-claire-element-id=\"9706655\">Au-del\u00e0 de modifier des styles directement, il peut \u00eatre tr\u00e8s utile d&#8217;ajouter des classes CSS \u00e0 un \u00e9l\u00e9ment de mani\u00e8re dynamique. \u00a0Comme \u00a0<code data-claire-semantic=\"text\">ngStyle<\/code>\u00a0, \u00a0<code data-claire-semantic=\"text\">ngClass<\/code>\u00a0 prend un objet cl\u00e9-valeur, mais cette fois avec la classe \u00e0 appliquer en cl\u00e9, et la condition en valeur.<\/p>\n<p id=\"r-5088522\" data-claire-element-id=\"9568417\">Pour cet exemple, je vous propose d&#8217;appliquer des classes Bootstrap \u00e0 la balise \u00a0<code data-claire-semantic=\"text\">&lt;li&gt;<\/code>\u00a0 en fonction du statut de l&#8217;appareil :<\/p>\n<p data-claire-element-id=\"9568417\"><\/p>\n\n<pre class=\"code-block\" data-claire-element-id=\"9568418\"><code class=\"ace\" data-claire-semantic=\"html\" data-code=\"{&quot;language&quot;:&quot;html&quot;,&quot;source&quot;:&quot;&amp;#x3C;li [ngClass]=&amp;#x22;{&amp;#x27;list-group-item&amp;#x27;: true,\\n                &amp;#x27;list-group-item-success&amp;#x27;: appareilStatus === &amp;#x27;allum&amp;#xE9;&amp;#x27;,\\n                &amp;#x27;list-group-item-danger&amp;#x27;: appareilStatus === &amp;#x27;&amp;#xE9;teint&amp;#x27;}&amp;#x22;&amp;#x3E;\\n  &amp;#x3C;div style=&amp;#x22;width:20px;height:20px;background-color:red;&amp;#x22;\\n       *ngIf=&amp;#x22;appareilStatus === &amp;#x27;&amp;#xE9;teint&amp;#x27;&amp;#x22;&amp;#x3E;&amp;#x3C;\/div&amp;#x3E;\\n  &amp;#x3C;h4 [ngStyle]=&amp;#x22;{color: getColor()}&amp;#x22;&amp;#x3E;Appareil : {{ appareilName }} -- Statut : {{ getStatus() }}&amp;#x3C;\/h4&amp;#x3E;\\n  &amp;#x3C;input type=&amp;#x22;text&amp;#x22; class=&amp;#x22;form-control&amp;#x22; [(ngModel)]=&amp;#x22;appareilName&amp;#x22;&amp;#x3E;\\n&amp;#x3C;\/li&amp;#x3E;&quot;}\" data-widget=\"codeBlock\"><\/code><\/pre>\n<div class=\"ace-openclassrooms\">\n<div class=\"ace_static_highlight ace_show_gutter\">\n<pre class=\"ace_line\"><span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">li<\/span> [<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">ngClass<\/span>]<span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"{'list-group-item': true,<\/span>\n<span class=\"ace_string ace_attribute-value ace_xml\"> 'list-group-item-success': appareilStatus === 'allum\u00e9',<\/span>\n<span class=\"ace_string ace_attribute-value ace_xml\"> 'list-group-item-danger': appareilStatus === '\u00e9teint'}\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">div<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">style<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"width:20px;height:20px;background-color:red;\"<\/span>\n*<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">ngIf<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"appareilStatus === '\u00e9teint'\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">div<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">h4<\/span> [<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">ngStyle<\/span>]<span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"{color: getColor()}\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><span class=\"ace_text ace_xml\">Appareil : {{ appareilName }} -- Statut : {{ getStatus() }}<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">h4<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_tag-open ace_xml\">&lt;<\/span><span class=\"ace_meta ace_tag ace_form ace_tag-name ace_xml\">input<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">type<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"text\"<\/span> <span class=\"ace_entity ace_other ace_attribute-name ace_xml\">class<\/span><span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"form-control\"<\/span> [(<span class=\"ace_entity ace_other ace_attribute-name ace_xml\">ngModel<\/span>)]<span class=\"ace_keyword ace_operator ace_attribute-equals ace_xml\">=<\/span><span class=\"ace_string ace_attribute-value ace_xml\">\"appareilName\"<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span>\n<span class=\"ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml\">&lt;\/<\/span><span class=\"ace_meta ace_tag ace_tag-name ace_xml\">li<\/span><span class=\"ace_meta ace_tag ace_punctuation ace_tag-close ace_xml\">&gt;<\/span><\/pre>\n<\/div>\n<\/div>\n<pre id=\"r-5088523\" class=\"code-block\" data-claire-element-id=\"9568418\"><code class=\"ace\" data-claire-semantic=\"html\" data-code=\"{&quot;language&quot;:&quot;html&quot;,&quot;source&quot;:&quot;&amp;#x3C;li [ngClass]=&amp;#x22;{&amp;#x27;list-group-item&amp;#x27;: true,\\n                &amp;#x27;list-group-item-success&amp;#x27;: appareilStatus === &amp;#x27;allum&amp;#xE9;&amp;#x27;,\\n                &amp;#x27;list-group-item-danger&amp;#x27;: appareilStatus === &amp;#x27;&amp;#xE9;teint&amp;#x27;}&amp;#x22;&amp;#x3E;\\n  &amp;#x3C;div style=&amp;#x22;width:20px;height:20px;background-color:red;&amp;#x22;\\n       *ngIf=&amp;#x22;appareilStatus === &amp;#x27;&amp;#xE9;teint&amp;#x27;&amp;#x22;&amp;#x3E;&amp;#x3C;\/div&amp;#x3E;\\n  &amp;#x3C;h4 [ngStyle]=&amp;#x22;{color: getColor()}&amp;#x22;&amp;#x3E;Appareil : {{ appareilName }} -- Statut : {{ getStatus() }}&amp;#x3C;\/h4&amp;#x3E;\\n  &amp;#x3C;input type=&amp;#x22;text&amp;#x22; class=&amp;#x22;form-control&amp;#x22; [(ngModel)]=&amp;#x22;appareilName&amp;#x22;&amp;#x3E;\\n&amp;#x3C;\/li&amp;#x3E;&quot;}\" data-widget=\"codeBlock\"><\/code><\/pre>\n<p id=\"r-5088524\" data-claire-element-id=\"9706656\">Angular appliquera donc syst\u00e9matiquement la classe \u00a0<code data-claire-semantic=\"text\">list-group-item<\/code>\u00a0, et selon le contenu de la variable \u00a0<code data-claire-semantic=\"text\">appareilStatus<\/code>\u00a0, appliquera l&#8217;une ou l&#8217;autre des deux autres classes. \u00a0Vous pouvez bien \u00e9videmment cr\u00e9er vos propres classes et les utiliser ; j&#8217;ai simplement choisi des classes Bootstrap pour simplifier l&#8217;explication.<\/p>\n\n<aside id=\"r-5088526\" data-claire-element-id=\"9706672\" data-claire-semantic=\"information\">\n<p id=\"r-5088525\" data-claire-element-id=\"9706671\">Que ce soit pour \u00a0<code data-claire-semantic=\"text\">ngStyle<\/code>\u00a0 ou pour \u00a0<code data-claire-semantic=\"text\">ngClass<\/code>\u00a0, les objets JS peuvent \u00eatre des variables valables dans votre TypeScript qui seront ensuite r\u00e9f\u00e9renc\u00e9es par la directive, par exemple : \u00a0<code data-claire-semantic=\"text\">[ngClass]=\"myClassObject\"<\/code>\u00a0.<\/p>\n\n<\/aside><\/div>\n<\/div>\n<\/div>\n<div class=\"js-courseSelementActions sideActions\" data-widget=\"courseElementActions\"><\/div>\n<\/div>\n<\/section><\/div>\n<\/div>\n<\/div>\n<aside id=\"content-with-sidebar\" class=\"contentWithSidebar__sidebar  js-contentWithSidebar-slidingElement\"><nav class=\"col-nav\">\n<div id=\"tab-courseMenu\" class=\"col-nav__inner js-sidebar-inner\">\n<div class=\"col-nav__block  col-nav__block--summary\">\n<div class=\"side-paginate\"><\/div>\n<\/div>\n<\/div>\n<\/nav><\/aside><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-13011\" class=\"elementor-tab-title\" data-tab=\"11\" role=\"button\" aria-controls=\"elementor-tab-content-13011\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Les services angular<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-13011\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"11\" role=\"region\" aria-labelledby=\"elementor-tab-title-13011\"><p><span><span class=\"\">Dans AngularJS, un service est une fonction, ou un objet, disponible et limit\u00e9 \u00e0 votre application AngularJS.<\/span><\/span><\/p><p><span>AngularJS a environ 30 services int\u00e9gr\u00e9s.\u00a0L&#8217;un d&#8217;eux est le\u00a0<\/span><code class=\"w3-codespan\">$location<\/code><span>\u00a0service.<\/span><\/p><p><span>Le\u00a0<\/span><code class=\"w3-codespan\">$location<\/code><span>service dispose de m\u00e9thodes qui renvoient des informations sur l&#8217;emplacement de la page Web actuelle:<\/span><\/p><div class=\"w3-example\"><h3><span>Exemple<\/span><\/h3><p><span>Utilisez le\u00a0<\/span><code class=\"w3-codespan\">$location<\/code><span>service dans un contr\u00f4leur:<\/span><\/p><pre class=\"w3-code notranslate jsHigh\"><span class=\"jscolor\"><span class=\"jskeywordcolor\">var<\/span>\u00a0app = angular.<span class=\"jspropertycolor\">module<\/span>(<span class=\"jsstringcolor\">'myApp'<\/span>, []);<br \/>app.<span class=\"jspropertycolor\">controller<\/span>(<span class=\"jsstringcolor\">'customersCtrl'<\/span>,\u00a0<span class=\"jskeywordcolor\">function<\/span>($scope, $location) {<br \/>\u00a0\u00a0\u00a0 $scope.<span class=\"jspropertycolor\">myUrl<\/span>\u00a0= $location.<span class=\"jspropertycolor\">absUrl<\/span>();<br \/>});<\/span><\/pre><\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-13012\" class=\"elementor-tab-title\" data-tab=\"12\" role=\"button\" aria-controls=\"elementor-tab-content-13012\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Pourquoi utiliser les services?<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-13012\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"12\" role=\"region\" aria-labelledby=\"elementor-tab-title-13012\"><p><span>Pour de nombreux services, comme le\u00a0<\/span><code class=\"w3-codespan\">$location<\/code><span>service, il semble que vous puissiez utiliser des objets qui sont d\u00e9j\u00e0 dans le DOM, comme l&#8217;\u00a0<\/span><code class=\"w3-codespan\">window.location<\/code><span>\u00a0objet, et vous le pouvez, mais cela aurait certaines limitations, au moins pour votre application AngularJS.<\/span><\/p><p><span>AngularJS supervise constamment votre application, et pour qu&#8217;elle g\u00e8re correctement les changements et les \u00e9v\u00e9nements, AngularJS pr\u00e9f\u00e8re que vous utilisiez le\u00a0<\/span><code class=\"w3-codespan\">$location<\/code><span>\u00a0service au lieu de l&#8217;\u00a0<\/span><code class=\"w3-codespan\">window.location<\/code><span>objet.<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-13013\" class=\"elementor-tab-title\" data-tab=\"13\" role=\"button\" aria-controls=\"elementor-tab-content-13013\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Cr\u00e9ez votre propre service<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-13013\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"13\" role=\"region\" aria-labelledby=\"elementor-tab-title-13013\"><p><span>Pour cr\u00e9er votre propre service, connectez votre service au module:<\/span><\/p><div class=\"w3-example\"><p><span>Cr\u00e9ez un service nomm\u00e9\u00a0<\/span><code class=\"w3-codespan\">hexafy<\/code><span>:<\/span><\/p><pre class=\"w3-code notranslate jsHigh\"><span class=\"jscolor\">app.<span class=\"jspropertycolor\">service<\/span>(<span class=\"jsstringcolor\">'hexafy'<\/span>,\u00a0<span class=\"jskeywordcolor\">function<\/span>() {<br \/>\u00a0\u00a0<span class=\"jskeywordcolor\">this<\/span>.<span class=\"jspropertycolor\">myFunc<\/span>\u00a0=\u00a0<span class=\"jskeywordcolor\">function<\/span>\u00a0(x) {<br \/>\u00a0\u00a0\u00a0\u00a0<span class=\"jskeywordcolor\">return<\/span>\u00a0x.<span class=\"jspropertycolor\">toString<\/span>(<span class=\"jsnumbercolor\">16<\/span>);<br \/>\u00a0\u00a0}<br \/>});<br \/><\/span><\/pre><\/div><p><span>Pour utiliser votre service personnalis\u00e9, ajoutez-le en tant que d\u00e9pendance lors de la d\u00e9finition du contr\u00f4leur:<\/span><\/p><div class=\"w3-example\"><h3><span>Exemple<\/span><\/h3><p><span>Utilisez le service personnalis\u00e9 nomm\u00e9\u00a0<\/span><code class=\"w3-codespan\">hexafy<\/code><span>pour convertir un nombre en nombre hexad\u00e9cimal:<\/span><\/p><div class=\"w3-code notranslate\"><pre class=\"jsHigh\"><span class=\"jscolor\">app.<span class=\"jspropertycolor\">controller<\/span>(<span class=\"jsstringcolor\">'myCtrl'<\/span>,\u00a0<span class=\"jskeywordcolor\">function<\/span>($scope,\u00a0<strong>hexafy<\/strong>) {<br \/>\u00a0\u00a0$scope.<span class=\"jspropertycolor\">hex<\/span>\u00a0=\u00a0<strong>hexafy<\/strong>.<span class=\"jspropertycolor\">myFunc<\/span>(<span class=\"jsnumbercolor\">255<\/span>);<br \/>});<\/span><\/pre><\/div><\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-13014\" class=\"elementor-tab-title\" data-tab=\"14\" role=\"button\" aria-controls=\"elementor-tab-content-13014\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Les foeemulaires<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-13014\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"14\" role=\"region\" aria-labelledby=\"elementor-tab-title-13014\"><p class=\"intro\"><span><span class=\"\">Les formulaires dans AngularJS fournissent la liaison de donn\u00e9es et la validation des contr\u00f4les d&#8217;entr\u00e9e.<\/span><\/span><\/p><hr \/><h4><span>Contr\u00f4les d&#8217;entr\u00e9e<\/span><\/h4><p><span>Les contr\u00f4les d&#8217;entr\u00e9e sont les \u00e9l\u00e9ments d&#8217;entr\u00e9e HTML:<\/span><\/p><ul><li><span>\u00e9l\u00e9ments d&#8217;entr\u00e9e<\/span><\/li><li><span>s\u00e9lectionner des \u00e9l\u00e9ments<\/span><\/li><li><span>\u00e9l\u00e9ments de bouton<\/span><\/li><li><span>\u00e9l\u00e9ments textarea<\/span><\/li><\/ul><hr \/><h4><span>Liaison de donn\u00e9es<\/span><\/h4><p><span>Les contr\u00f4les d&#8217;entr\u00e9e fournissent une liaison de donn\u00e9es \u00e0 l&#8217;aide de la\u00a0<\/span><code class=\"w3-codespan\">ng-model<\/code><span>directive.<\/span><\/p><div class=\"w3-example\"><div class=\"w3-code notranslate htmlHigh\"><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>input<span class=\"attributecolor\">\u00a0type<span class=\"attributevaluecolor\">=&#8221;text&#8221;<\/span>\u00a0ng-model<span class=\"attributevaluecolor\">=&#8221;firstname&#8221;<\/span><\/span><span class=\"tagcolor\">&gt;<\/span><\/span><\/div><\/div><p><span>L&#8217;application a maintenant une propri\u00e9t\u00e9 nomm\u00e9e\u00a0<\/span><code class=\"w3-codespan\">firstname<\/code><span>.<\/span><\/p><p><span>La\u00a0<\/span><code class=\"w3-codespan\">ng-model<\/code><span>directive lie le contr\u00f4leur d&#8217;entr\u00e9e au reste de votre application.<\/span><\/p><p><span>La propri\u00e9t\u00e9\u00a0<\/span><code class=\"w3-codespan\">firstname<\/code><span>, peut \u00eatre r\u00e9f\u00e9renc\u00e9e dans un contr\u00f4leur:<\/span><\/p><div class=\"w3-example\"><h5><span>Exemple<\/span><\/h5><pre class=\"w3-code notranslate htmlHigh\"><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>script<span class=\"tagcolor\">&gt;<\/span><\/span><span class=\"jscolor\"><br \/><span class=\"jskeywordcolor\">var<\/span>\u00a0app = angular.<span class=\"jspropertycolor\">module<\/span>(<span class=\"jsstringcolor\">'myApp'<\/span>, []);<br \/>app.<span class=\"jspropertycolor\">controller<\/span>(<span class=\"jsstringcolor\">'formCtrl'<\/span>,\u00a0<span class=\"jskeywordcolor\">function<\/span>($scope) {<br \/>\u00a0 $scope.<span class=\"jspropertycolor\">firstname<\/span>\u00a0=\u00a0<span class=\"jsstringcolor\">\"John\"<\/span>;<br \/>});<br \/><\/span><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>\/script<span class=\"tagcolor\">&gt;<\/span><\/span><\/pre><\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h4 id=\"elementor-tab-title-13015\" class=\"elementor-tab-title\" data-tab=\"15\" role=\"button\" aria-controls=\"elementor-tab-content-13015\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Routage AngularJS<\/a>\n\t\t\t\t\t<\/h4>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-13015\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"15\" role=\"region\" aria-labelledby=\"elementor-tab-title-13015\"><div class=\"w3-clear nextprev\">\u00a0<\/div><p class=\"intro\"><span>Le <\/span><code class=\"w3-codespan\">ngRoute<\/code><span>module aide votre application \u00e0 devenir une application \u00e0 page unique.<\/span><\/p><hr \/><h4><span>Qu&#8217;est-ce que le routage dans AngularJS?<\/span><\/h4><p><span>Si vous souhaitez naviguer vers diff\u00e9rentes pages de votre application, mais que vous souhaitez \u00e9galement que l&#8217;application soit une SPA (application \u00e0 page unique), sans rechargement de page, vous pouvez utiliser le\u00a0<\/span><code class=\"w3-codespan\">ngRoute<\/code><span>module.<\/span><\/p><p><span>Le\u00a0<\/span><code class=\"w3-codespan\">ngRoute<\/code><span>module\u00a0<\/span><em><span>achemine<\/span><\/em><span>\u00a0votre application vers diff\u00e9rentes pages sans recharger l&#8217;ensemble de l&#8217;application.<\/span><\/p><div class=\"w3-example\"><h5><span>Exemple:<\/span><\/h5><p><span>Acc\u00e9dez \u00e0 &#8220;red.htm&#8221;, &#8220;green.htm&#8221; et &#8220;blue.htm&#8221;:<\/span><\/p><pre class=\"w3-code notranslate htmlHigh\"><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>body<span class=\"attributecolor\">\u00a0ng-app<span class=\"attributevaluecolor\">=\"myApp\"<\/span><\/span><span class=\"tagcolor\">&gt;<\/span><\/span><br \/><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>p<span class=\"tagcolor\">&gt;<\/span><\/span><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>a<span class=\"attributecolor\">\u00a0href<span class=\"attributevaluecolor\">=\"#\/!\"<\/span><\/span><span class=\"tagcolor\">&gt;<\/span><\/span>Main<span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>\/a<span class=\"tagcolor\">&gt;<\/span><\/span><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>\/p<span class=\"tagcolor\">&gt;<\/span><\/span><br \/><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>a<span class=\"attributecolor\">\u00a0href<span class=\"attributevaluecolor\">=\"#!red\"<\/span><\/span><span class=\"tagcolor\">&gt;<\/span><\/span>Red<span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>\/a<span class=\"tagcolor\">&gt;<\/span><\/span><br \/><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>a<span class=\"attributecolor\">\u00a0href<span class=\"attributevaluecolor\">=\"#!green\"<\/span><\/span><span class=\"tagcolor\">&gt;<\/span><\/span>Green<span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>\/a<span class=\"tagcolor\">&gt;<\/span><\/span><br \/><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>a<span class=\"attributecolor\">\u00a0href<span class=\"attributevaluecolor\">=\"#!blue\"<\/span><\/span><span class=\"tagcolor\">&gt;<\/span><\/span>Blue<span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>\/a<span class=\"tagcolor\">&gt;<\/span><\/span><br \/><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>div<span class=\"attributecolor\">\u00a0ng-view<\/span><span class=\"tagcolor\">&gt;<\/span><\/span><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>\/div<span class=\"tagcolor\">&gt;<\/span><\/span><br \/><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>script<span class=\"tagcolor\">&gt;<\/span><\/span><span class=\"jscolor\"><br \/><span class=\"jskeywordcolor\">var<\/span>\u00a0app = angular.<span class=\"jspropertycolor\">module<\/span>(<span class=\"jsstringcolor\">\"myApp\"<\/span>, [<span class=\"jsstringcolor\">\"ngRoute\"<\/span>]);<br \/>app.<span class=\"jspropertycolor\">config<\/span>(<span class=\"jskeywordcolor\">function<\/span>($routeProvider) {<br \/>\u00a0 $routeProvider<br \/>\u00a0 .<span class=\"jspropertycolor\">when<\/span>(<span class=\"jsstringcolor\">\"\/\"<\/span>, {<br \/>\u00a0\u00a0\u00a0 templateUrl :\u00a0<span class=\"jsstringcolor\">\"main.htm\"<\/span><br \/>\u00a0 })<br \/>\u00a0 .<span class=\"jspropertycolor\">when<\/span>(<span class=\"jsstringcolor\">\"\/red\"<\/span>, {<br \/>\u00a0\u00a0\u00a0 templateUrl :\u00a0<span class=\"jsstringcolor\">\"red.htm\"<\/span><br \/>\u00a0 })<br \/>\u00a0 .<span class=\"jspropertycolor\">when<\/span>(<span class=\"jsstringcolor\">\"\/green\"<\/span>, {<br \/>\u00a0\u00a0\u00a0 templateUrl :\u00a0<span class=\"jsstringcolor\">\"green.htm\"<\/span><br \/>\u00a0\u00a0})<br \/>\u00a0 .<span class=\"jspropertycolor\">when<\/span>(<span class=\"jsstringcolor\">\"\/blue\"<\/span>, {<br \/>\u00a0\u00a0\u00a0 templateUrl :\u00a0<span class=\"jsstringcolor\">\"blue.htm\"<\/span><br \/>\u00a0\u00a0});<br \/>});<br \/><\/span><span class=\"tagnamecolor\"><span class=\"tagcolor\">&lt;<\/span>\/script<span class=\"tagcolor\">&gt;<br \/><\/span><\/span>&lt;\/body&gt;<\/pre><\/div><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-10f5479\" data-id=\"10f5479\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ed199cd elementor-widget elementor-widget-sidebar\" data-id=\"ed199cd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"sidebar.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"search-2\" class=\"widget widget_search\">\n<form role=\"search\" method=\"get\" class=\"searchform\" action=\"https:\/\/kaay-coder.2sweb.sn\/kc\/\">\n\n\t<label>\n\n\t\t<span class=\"screen-reader-text\">Recherche pour\u00a0:<\/span>\n\t\t<input type=\"search\" id=\"searchform-1\" name=\"s\" value=\"\" placeholder=\"Rechercher &hellip;\" title=\"Appuyez sur Entrer pour rechercher\" \/>\n\n\t\t\n\t\t\t<button value=\"Search\" class=\"wpbff wpbff-search\"><\/button>\n\n\t\t\n\t<\/label>\n\n<\/form>\n<\/div><div id=\"calendar-2\" class=\"widget widget_calendar\"><div id=\"calendar_wrap\" class=\"calendar_wrap\"><table id=\"wp-calendar\" class=\"wp-calendar-table\">\n\t<caption>juin 2026<\/caption>\n\t<thead>\n\t<tr>\n\t\t<th scope=\"col\" aria-label=\"lundi\">L<\/th>\n\t\t<th scope=\"col\" aria-label=\"mardi\">M<\/th>\n\t\t<th scope=\"col\" aria-label=\"mercredi\">M<\/th>\n\t\t<th scope=\"col\" aria-label=\"jeudi\">J<\/th>\n\t\t<th scope=\"col\" aria-label=\"vendredi\">V<\/th>\n\t\t<th scope=\"col\" aria-label=\"samedi\">S<\/th>\n\t\t<th scope=\"col\" aria-label=\"dimanche\">D<\/th>\n\t<\/tr>\n\t<\/thead>\n\t<tbody>\n\t<tr><td>1<\/td><td>2<\/td><td>3<\/td><td>4<\/td><td id=\"today\">5<\/td><td>6<\/td><td>7<\/td>\n\t<\/tr>\n\t<tr>\n\t\t<td>8<\/td><td>9<\/td><td>10<\/td><td>11<\/td><td>12<\/td><td>13<\/td><td>14<\/td>\n\t<\/tr>\n\t<tr>\n\t\t<td>15<\/td><td>16<\/td><td>17<\/td><td>18<\/td><td>19<\/td><td>20<\/td><td>21<\/td>\n\t<\/tr>\n\t<tr>\n\t\t<td>22<\/td><td>23<\/td><td>24<\/td><td>25<\/td><td>26<\/td><td>27<\/td><td>28<\/td>\n\t<\/tr>\n\t<tr>\n\t\t<td>29<\/td><td>30<\/td>\n\t\t<td class=\"pad\" colspan=\"5\">&nbsp;<\/td>\n\t<\/tr>\n\t<\/tbody>\n\t<\/table><nav aria-label=\"Mois pr\u00e9c\u00e9dents et suivants\" class=\"wp-calendar-nav\">\n\t\t<span class=\"wp-calendar-nav-prev\"><a href=\"https:\/\/kaay-coder.2sweb.sn\/kc\/2021\/03\/\">&laquo; Mar<\/a><\/span>\n\t\t<span class=\"pad\">&nbsp;<\/span>\n\t\t<span class=\"wp-calendar-nav-next\">&nbsp;<\/span>\n\t<\/nav><\/div><\/div>\n\t\t<div id=\"recent-posts-2\" class=\"widget widget_recent_entries\">\n\t\t<h4 class=\"wpbf-widgettitle\">Articles r\u00e9cents<\/h4>\n\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t\t<li>\n\t\t\t\t\t<a href=\"https:\/\/kaay-coder.2sweb.sn\/kc\/hello-world\/\">Kaay-Coder !<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t<\/ul>\n\n\t\t<\/div><div id=\"archives-2\" class=\"widget widget_archive\"><h4 class=\"wpbf-widgettitle\">Archives<\/h4>\n\t\t\t<ul>\n\t\t\t\t\t<li><a href='https:\/\/kaay-coder.2sweb.sn\/kc\/2021\/03\/'>mars 2021<\/a><\/li>\n\t\t\t<\/ul>\n\n\t\t\t<\/div><div id=\"media_gallery-2\" class=\"widget widget_media_gallery\"><div id='gallery-1' class='gallery galleryid-128 gallery-columns-2 gallery-size-thumbnail'><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/kaay-coder.2sweb.sn\/kc\/accueil\/html\/'><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/html-150x150.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" srcset=\"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/html-150x150.png 150w, https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/html-300x300.png 300w, https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/html.png 421w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/kaay-coder.2sweb.sn\/kc\/dmxbe\/'><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/dMXbE-150x150.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/kaay-coder.2sweb.sn\/kc\/angular_hub642029a576c43637a3db16b5fc361ac_2385_700x450_fit_box_2\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/angular_hub642029a576c43637a3db16b5fc361ac_2385_700x450_fit_box_2-150x150.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" srcset=\"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/angular_hub642029a576c43637a3db16b5fc361ac_2385_700x450_fit_box_2-150x150.png 150w, https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/angular_hub642029a576c43637a3db16b5fc361ac_2385_700x450_fit_box_2.png 250w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/kaay-coder.2sweb.sn\/kc\/wordpress_logo_8-1-1024x1015\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/Wordpress_logo_8-1-1024x1015-1-150x150.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" srcset=\"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/Wordpress_logo_8-1-1024x1015-1-150x150.png 150w, https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/Wordpress_logo_8-1-1024x1015-1-300x297.png 300w, https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/Wordpress_logo_8-1-1024x1015-1-768x761.png 768w, https:\/\/kaay-coder.2sweb.sn\/kc\/wp-content\/uploads\/2021\/03\/Wordpress_logo_8-1-1024x1015-1.png 1024w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/><\/a>\n\t\t\t<\/div><\/figure>\n\t\t<\/div>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Qu&#8217;est ce que Angular ? Angular&nbsp;est un&nbsp;Framework&nbsp;open source \u00e9crit en&nbsp;JavaScript&nbsp;qui permet la cr\u00e9ation d\u2019applications Web et plus particuli\u00e8rement de ce qu\u2019on appelle des &nbsp;\u00ab&nbsp;Single Page Applications \u00bb&nbsp;: des applications web accessibles via une page web unique qui permet de fluidifier l\u2019exp\u00e9rience utilisateur et d\u2019\u00e9viter les chargements. D\u00e9velopp\u00e9 par Google, Angular est un&nbsp;Framework&nbsp;open source \u00e9crit en&nbsp;JavaScript&nbsp;qui [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"class_list":["post-128","page","type-page","status-publish","hentry","wpbf-post"],"_links":{"self":[{"href":"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-json\/wp\/v2\/pages\/128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-json\/wp\/v2\/comments?post=128"}],"version-history":[{"count":44,"href":"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-json\/wp\/v2\/pages\/128\/revisions"}],"predecessor-version":[{"id":872,"href":"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-json\/wp\/v2\/pages\/128\/revisions\/872"}],"wp:attachment":[{"href":"https:\/\/kaay-coder.2sweb.sn\/kc\/wp-json\/wp\/v2\/media?parent=128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}