{"id":174,"date":"2014-12-04T09:41:49","date_gmt":"2014-12-04T08:41:49","guid":{"rendered":"http:\/\/lalloue.fr\/blog\/?p=174"},"modified":"2014-12-31T14:01:26","modified_gmt":"2014-12-31T13:01:26","slug":"angularjs-oui-au-timeout-non-au-settimeout","status":"publish","type":"post","link":"http:\/\/lalloue.fr\/blog\/angularjs-oui-au-timeout-non-au-settimeout\/","title":{"rendered":"AngularJS: OUI au $timeout, NOn au setTimeout"},"content":{"rendered":"<p><a href=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2014\/12\/AngularJS-large.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-166\" src=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2014\/12\/AngularJS-large-300x84.png\" alt=\"AngularJS-large\" width=\"300\" height=\"84\" srcset=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2014\/12\/AngularJS-large-300x84.png 300w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2014\/12\/AngularJS-large.png 383w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Pour tous les habitu\u00e9s du Javascript, il arrive souvent d&#8217;avoir besoin d&#8217;un &#8216;timeout&#8217; (ou pause en fran\u00e7ais) avant d\u2019ex\u00e9cuter une action.<br \/>\nEt pour cela la premi\u00e8re chose qui nous vient \u00e0 l&#8217;id\u00e9e c&#8217;est la m\u00e9thode\u00a0<strong>setTimeout()<\/strong>.<\/p>\n<p>OUI, mais&#8230;pas avec AngularJS !<\/p>\n<p><!--more--><\/p>\n<h3>Pourquoi pas avec Angular?<\/h3>\n<p>Parce que si vous utilisez la m\u00e9thode\u00a0<strong>setTimeout()<\/strong> avec AngularJS (ce qui est tout \u00e0 fait faisable finalement), vous allez \u00eatre oblig\u00e9 d&#8217;utiliser la m\u00e9thode\u00a0<strong>$scope.$apply()\u00a0<\/strong>pour vous assurer que tous les changements effectu\u00e9s dans le scope auront bien \u00e9t\u00e9 r\u00e9percut\u00e9s partout.<\/p>\n<p>AngularJS fournit\u00a0une m\u00e9thode sp\u00e9cialement con\u00e7u pour ce cas :\u00a0<strong>$timeout()<\/strong><\/p>\n<p>Cette m\u00e9thode appelle elle-m\u00eame \u00a0$apply() pour nous et va s&#8217;assurer que toutes les donn\u00e9es soient bien renseign\u00e9es dans le scope. Et on n&#8217;a rien \u00e0 faire d&#8217;autre !<\/p>\n<h3>Et qu&#8217;est ce que \u00e7a donne dans la pratique?<\/h3>\n<p>\u00c7a donne quelque chose comme \u00e7a :<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nfunction MonController($scope, $timeout) {\r\n    var timer;\r\n    $scope.timeInMs = 0;\r\n\r\n    var maFonction = function(){\r\n        timer = $timeout(function(){\r\n            $scope.timeInMs += 1000;\r\n            timer = $timeout(maFonction, 1000);\r\n        }, 1000);\r\n    };\r\n\r\n    maFonction();\r\n\r\n    $scope.$on('$destroy',function(){\r\n        $timeout.cancel(timer);\r\n    });\r\n}\r\n<\/pre>\n<p>Donc on a ici un Controller tout simple qui s\u2019appelle &#8220;MonController&#8221;.<br \/>\nDans ce Controller je d\u00e9clare un &#8216;timer&#8217; qui sera renseign\u00e9 par la fonction\u00a0$timeout toutes les 1000 millisecondes.<\/p>\n<p>Et voici\u00a0la d\u00e9mo pour vous prouver que tout cela fonctionne :<\/p>\n\n<!-- iframe plugin v.4.5 wordpress.org\/plugins\/iframe\/ -->\n<iframe src=\"http:\/\/jsfiddle.net\/glalloue\/ssg1h1kb\/embedded\/\" frameborder=\"0\" width=\"100%\" height=\"350\" scrolling=\"yes\" class=\"iframe-class\"><\/iframe>\n\n<p>Petite remarque de fin, vous avez surement remarqu\u00e9 la m\u00e9thode\u00a0<strong>$timeout.cancel<\/strong> appel\u00e9e lors de l&#8217;evenement &#8216;destroy&#8217; du scope.<br \/>\nCette m\u00e9thode est tr\u00e8s importante car elle permet de &#8216;close&#8217; (fermer) le timeout proprement pour qu&#8217;il ne continue pas \u00e0 s\u2019ex\u00e9cuter alors que vous avez chang\u00e9 de page par exemple.<\/p>\n<p>Globalement c&#8217;est une bonne pratique de toujours v\u00e9rifier si l&#8217;on peut fermer \/ arr\u00eater \/ close une execution\u00a0qui tourne en t\u00e2che de fond comme le timeout.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour tous les habitu\u00e9s du Javascript, il arrive souvent d&#8217;avoir besoin d&#8217;un &#8216;timeout&#8217; (ou pause en fran\u00e7ais) avant d\u2019ex\u00e9cuter une action. Et pour cela la premi\u00e8re chose qui nous vient \u00e0 l&#8217;id\u00e9e c&#8217;est la m\u00e9thode\u00a0setTimeout(). OUI, mais&#8230;pas avec AngularJS !<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[17,9],"tags":[19,39],"_links":{"self":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts\/174"}],"collection":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/comments?post=174"}],"version-history":[{"count":10,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts\/174\/revisions"}],"predecessor-version":[{"id":184,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts\/174\/revisions\/184"}],"wp:attachment":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/media?parent=174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/categories?post=174"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/tags?post=174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}