<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>c2i.fr - angular</title><link>http://www.c2i.fr:80/Tags/angular</link><description>c2i.fr - angular</description><item><title>Angular : Ajouter un bouton d'installation pour votre application PWA</title><link>http://www.c2i.fr:80/articles/angular-ajouter-un-bouton-d-installation-pour-votre-application-pwa</link><description>&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/BK9CQLRsU7c" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Quand vous cr&amp;eacute;ez une application web PWA, sous Android, quand Chrome charge votre application, il vous propose automatiquement de l'installer.&lt;/p&gt;
&lt;p&gt;Il faut savoir que ce comportement par d&amp;eacute;faut va changer : ils ont en effet trouv&amp;eacute; que c'&amp;eacute;tait trop intrusif, qu'on ne laissait pas le choix &amp;agrave; l'utilisateur de faire cette installation quand il le voulait.&lt;/p&gt;
&lt;p&gt;De plus, si l'utilisateur &amp;eacute;tait en train de faire quelquechose dans l'application, il y a de fortes chances pour qu'il envoit bouler ce "pop-up" et moralit&amp;eacute;, l'application n'&amp;eacute;tait pas install&amp;eacute;e.&lt;/p&gt;
&lt;p&gt;Avec Chrome 70 et Windows 10, le comportement est de ne pas proposer ce pop-up d'installation.&lt;/p&gt;
&lt;p&gt;L'utilisateur a toujours la possibilit&amp;eacute; d'installer l'application en allant dans le menu de Chrome puis en cliquant sur "Installer xxx...". Mais bon, il y a 99.9% de chances que Mme Michu ne fasse jamais cette action. D'ailleurs, &amp;agrave; part le d&amp;eacute;veloppeur de l'application, je ne vois pas qui le ferait.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="/Media/Default/BlogPost/articles/PWAAddButton-1.png" alt="" width="552" height="520" /&gt;&lt;/p&gt;
&lt;h1&gt;Cr&amp;eacute;er un bouton Installer l'application&lt;/h1&gt;
&lt;p&gt;L'id&amp;eacute;e est donc plut&amp;ocirc;t de proposer un bouton Installer l'application. Plusieurs avantages :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'utilisateur saura que l'application est "installable",&lt;/li&gt;
&lt;li&gt;L'utilisateur choisira le moment de cette installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Respect de l'utilisateur tout en poussant ce dernier &amp;agrave; installer son application f&amp;eacute;tiche.&lt;/p&gt;
&lt;p&gt;&lt;img src="/Media/Default/BlogPost/articles/PWAAddButton-2.png" alt="" width="582" height="560" /&gt;&lt;/p&gt;
&lt;p&gt;C&amp;ocirc;t&amp;eacute; UI, c'est simple : j'ajoute un bouton/lien qui n'est visible que si l'application est "installable" (ie bien form&amp;eacute;e selon les crit&amp;egrave;res PWA et pas d&amp;eacute;j&amp;agrave; install&amp;eacute;e). Quand on clique dessus, j'appelerais une m&amp;eacute;thode qui effectuera cette installation :&lt;/p&gt;
&lt;div style="color: #d4d4d4; background-color: #1e1e1e; font-family: Consolas, 'Courier New', monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;
&lt;div&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;a&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;mat-list-item&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;(click)&lt;/span&gt;=&lt;span style="color: #ce9178;"&gt;'installApp()'&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;*ngIf&lt;/span&gt;=&lt;span style="color: #ce9178;"&gt;'showInstallButton'&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;mat-icon&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;mat-list-icon&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;fontSet&lt;/span&gt;=&lt;span style="color: #ce9178;"&gt;'fas'&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;fontIcon&lt;/span&gt;=&lt;span style="color: #ce9178;"&gt;'fa-download'&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;mat-icon&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;div&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;mat-line&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;gt;&lt;/span&gt;Installer l'application&lt;span style="color: #808080;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;div&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;a&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;showInstallButton est une variable de mon composant de type boolean par d&amp;eacute;faut &amp;eacute;gal &amp;agrave; false.&lt;/p&gt;
&lt;p&gt;Maintenant &lt;strong&gt;ATTENTION&lt;/strong&gt; : le code qui suit n'est valable que pour Chrome 45+ sous Android et Windows 10. C'est une "non-standard feature" !&lt;/p&gt;
&lt;p&gt;Si le navigateur (en l'occurence Chrome) d&amp;eacute;tecte que votre application est une application PWA valide (manifeste + service worker + icones qu'il faut), il d&amp;eacute;clenchera l'&amp;eacute;v&amp;egrave;nement de l'object window BeforeInstallPromptEvent. Cet &amp;eacute;v&amp;egrave;nement signifie : "je vais afficher la boite de dialogue pour installer l'application. Je la montre pour de vrai ou pas ?"&lt;/p&gt;
&lt;p&gt;Ce que l'on va faire, puisqu'on ne veut pas d&amp;eacute;ranger l'utilisateur dans sa lecture du site, c'est de diff&amp;eacute;rer notre r&amp;eacute;ponse. Donc on sauvegarde pour r&amp;eacute;pondre plus tard et on affiche alors le bouton Installer l'application.&lt;/p&gt;
&lt;p&gt;Dans notre composant Angular, il faut donc s'abonner &amp;agrave; cet &amp;eacute;v&amp;egrave;nement, ce que l'on fait gr&amp;acirc;ce au d&amp;eacute;corateur HostListener :&lt;/p&gt;
&lt;div style="color: #d4d4d4; background-color: #1e1e1e; font-family: Consolas, 'Courier New', monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;
&lt;div&gt;@&lt;span style="color: #dcdcaa;"&gt;HostListener&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'window:beforeinstallprompt'&lt;/span&gt;, [&lt;span style="color: #ce9178;"&gt;'$event'&lt;/span&gt;])&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #dcdcaa;"&gt;onBeforeinstallprompt&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;ev&lt;/span&gt;) {&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;ev&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;preventDefault&lt;/span&gt;();&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// on affiche le bouton install&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #569cd6;"&gt;this&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;showInstallButton&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// on "stocke" le prompt.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #569cd6;"&gt;this&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;deferredPrompt&lt;/span&gt; = &lt;span style="color: #9cdcfe;"&gt;ev&lt;/span&gt;;&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Puis quand l'utilisateur a enfin d&amp;eacute;cider d'installer l'application, c'est &amp;agrave; dire quand il a cliqu&amp;eacute; sur notre bouton, on continue la proc&amp;eacute;dure d'installation :&lt;/p&gt;
&lt;div style="color: #d4d4d4; background-color: #1e1e1e; font-family: Consolas, 'Courier New', monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;
&lt;div&gt;&lt;span style="color: #dcdcaa;"&gt;installApp&lt;/span&gt;() {&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// on affiche la boite de dialogue : installer l'application&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #569cd6;"&gt;this&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;deferredPrompt&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;prompt&lt;/span&gt;();&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// selon la r&amp;eacute;ponse de l'utilisateur&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #569cd6;"&gt;this&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;deferredPrompt&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;userChoice&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;.&lt;span style="color: #dcdcaa;"&gt;then&lt;/span&gt;((&lt;span style="color: #9cdcfe;"&gt;choiceResult&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #c586c0;"&gt;if&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;choiceResult&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;outcome&lt;/span&gt; === &lt;span style="color: #ce9178;"&gt;'accepted'&lt;/span&gt;) {&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #4ec9b0;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Youpi, notre appli est install&amp;eacute;e'&lt;/span&gt;);&lt;/div&gt;
&lt;div&gt;} &lt;span style="color: #c586c0;"&gt;else&lt;/span&gt; {&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #4ec9b0;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Arg, il en veut pas !'&lt;/span&gt;);&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #569cd6;"&gt;this&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;showInstallButton&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;false&lt;/span&gt;;&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// la madame elle fait le m&amp;eacute;nache&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #569cd6;"&gt;this&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;deferredPrompt&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;null&lt;/span&gt;;&lt;/div&gt;
&lt;div&gt;});&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That's all !&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description><pubDate>Fri, 19 Oct 2018 12:28:48 GMT</pubDate><guid isPermaLink="true">http://www.c2i.fr:80/articles/angular-ajouter-un-bouton-d-installation-pour-votre-application-pwa</guid></item><item><title>[Video] Créer un service worker avec angular 5</title><link>http://www.c2i.fr:80/articles/video-creer-un-service-worker-avec-angular-5</link><description>&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/mlAQks_Ims4" frameborder="0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/p&gt;</description><pubDate>Tue, 14 Nov 2017 07:58:46 GMT</pubDate><guid isPermaLink="true">http://www.c2i.fr:80/articles/video-creer-un-service-worker-avec-angular-5</guid></item><item><title>[Videos] Formation à ... Angular + ASP .NET Web API</title><link>http://www.c2i.fr:80/articles/formation-a-angular-aspnet-web-api</link><description>&lt;p&gt;Le but de ces tutoriels est de vous montrer comment d&amp;eacute;velopper une application fullstack avec Angular et ASP .NET Web API.&lt;/p&gt;
&lt;p&gt;Code disponible sur Github : &lt;a href="https://www.github.com/RichardC64/DemoAngularWebApi"&gt;https://github.com/RichardC64/DemoAngularWebApi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cette premi&amp;egrave;re &amp;eacute;tape consiste &amp;agrave; mettre en place le squelette de la partie cliente, application Angular, avec angular-cli.&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/HbmmL-ee9Es" frameborder="0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h2&gt;Etape 1 : Installez NodeJs&lt;/h2&gt;
&lt;p&gt;Rendez-vous pour cela sur le site&amp;nbsp;&lt;a href="https://nodejs.org/fr/" target="_blank"&gt;https://nodejs.org/fr/&lt;/a&gt;&amp;nbsp;et installez la derni&amp;egrave;re version de NodeJs.&lt;/p&gt;
&lt;h2&gt;Etape 2 : Installez angular-cli&lt;/h2&gt;
&lt;p&gt;Ouvrez une invite de commande et tapez :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;npm install -g @angular/cli@latest&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Etape 3 : G&amp;eacute;n&amp;eacute;ration du squelette de l'application&lt;/h2&gt;
&lt;p&gt;Cr&amp;eacute;ez un r&amp;eacute;pertoire par exemple D:\DemoAngular.&lt;/p&gt;
&lt;p&gt;Ouvrez une ligne de commande et placez vous dans ce r&amp;eacute;pertoire. Tapez ;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ng new drh&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ou drh est le nom de votre application.&lt;/p&gt;
&lt;p&gt;Apr&amp;egrave;s un "long moment", votre application a &amp;eacute;t&amp;eacute; g&amp;eacute;n&amp;eacute;r&amp;eacute;e. D&amp;eacute;placez vous dans le r&amp;eacute;pertoire D:\DemoAngular\drh puis tapez :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ng serve -o&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Votre application est "compil&amp;eacute;e", le navigateur est lanc&amp;eacute; et ouvre automatiquement la page d'accueil de votre application &amp;agrave; l'adresse http://localhost:4200.&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/HHR1KjX2GlE" frameborder="0" allowfullscreen="" style="font-size: 10px;"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/iiJetcDF4lw" frameborder="0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/CzSl8ZFKh_A" frameborder="0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/p&gt;</description><pubDate>Tue, 14 Nov 2017 07:58:21 GMT</pubDate><guid isPermaLink="true">http://www.c2i.fr:80/articles/formation-a-angular-aspnet-web-api</guid></item></channel></rss>