{"id":230733,"date":"2022-12-07T12:05:00","date_gmt":"2022-12-07T09:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230733"},"modified":"2022-12-07T11:49:07","modified_gmt":"2022-12-07T08:49:07","slug":"declencher-des-evenements-angulaires-avec-jquery","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/declencher-des-evenements-angulaires-avec-jquery\/","title":{"rendered":"D\u00e9clencher des \u00e9v\u00e9nements angulaires avec jQuery"},"content":{"rendered":"\n<p>L&rsquo;une des choses que j&rsquo;appr\u00e9cie dans le travail avec WordPress est la possibilit\u00e9 d&rsquo;apporter des biblioth\u00e8ques et des outils tiers avec lesquels travailler.<\/p>\n<p>Cela ne signifie pas qu&rsquo;ils ne viennent pas sans leur courbe d&rsquo;apprentissage (ils le font tous, n&rsquo;est-ce pas\u00a0?), Mais il est souvent amusant &#8211; bien que parfois frustrant &#8211; d&rsquo;incorporer puis de manipuler ce que vous faites.<\/p>\n<p>En ce qui concerne les technologies tierces, j&rsquo;ai vu des gens apporter des \u00e9l\u00e9ments tels que <strong><a href=\"https:\/\/packagist.org\/packages\/withfatpanda\/illuminate-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le package Laravel Illuminate<\/a><\/strong> avec WordPress.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162460-61e73f54b1a2e.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162460-61e73f54b1a2e.png\" alt=\"D\u00e9clencher des \u00e9v\u00e9nements angulaires avec jQuery\" ><\/a><\/p>\n<p>Et je sais, surtout ces derni\u00e8res ann\u00e9es, que beaucoup ont apport\u00e9 des composants tels que <strong><a href=\"https:\/\/reactjs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a><\/strong> et <strong><a href=\"https:\/\/vuejs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Vue<\/a><\/strong>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162460-61e73f5876c07.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162460-61e73f5876c07.png\" alt=\"D\u00e9clencher des \u00e9v\u00e9nements angulaires avec jQuery\" ><\/a><\/p>\n<p>Dans un tel cas, j&rsquo;ai travaill\u00e9 avec <strong><a href=\"https:\/\/angular.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Angular<\/a><\/strong>. Et si vous \u00eates habitu\u00e9 \u00e0 ES6, \u00e0 JavaScript vanille ou \u00e0 l&rsquo;utilisation de jQuery, le d\u00e9clenchement d&rsquo;\u00e9v\u00e9nements angulaires avec jQuery peut sembler un peu bizarre au d\u00e9but.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162460-61e73f5cad032.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162460-61e73f5cad032.png\" alt=\"D\u00e9clencher des \u00e9v\u00e9nements angulaires avec jQuery\" ><\/a><\/p>\n<p>Mais une fois que vous avez compris le balisage et comment Angular g\u00e8re ses \u00e9v\u00e9nements, ce n&rsquo;est pas si mal.<\/p>\n<h2>D\u00e9clencher des \u00e9v\u00e9nements angulaires avec jQuery<\/h2>\n<p>Angular fonctionne un peu diff\u00e9remment de jQuery dans la fa\u00e7on dont il interagit avec le DOM chaque fois qu&rsquo;un \u00e9v\u00e9nement se produit.<\/p>\n<p>Par exemple, disons qu&rsquo;en utilisant jQuery (ou m\u00eame du JavaScript vanille), nous avons une page, puis dans cette page se trouve un ensemble de balisage pouvant inclure une vari\u00e9t\u00e9 d&rsquo;\u00e9l\u00e9ments. Ceux-ci peuvent \u00eatre :<\/p>\n<ul>\n<li>rubriques,<\/li>\n<li>paragraphes,<\/li>\n<li>\u00c9tiquettes,<\/li>\n<li>s\u00e9lectionner des \u00e9l\u00e9ments,<\/li>\n<li>etc.<\/li>\n<\/ul>\n<p>Avec jQuery, nous avons l&rsquo;habitude de faire quelque chose comme ceci\u00a0:<\/p>\n<ol>\n<li>trouver l&rsquo;\u00e9l\u00e9ment sur lequel on veut op\u00e9rer soit via ID, nom de classe, ou un autre attribut,<\/li>\n<li>\u00e9couter un \u00e9v\u00e9nement,<\/li>\n<li>r\u00e9pondre de mani\u00e8re appropri\u00e9e.<\/li>\n<\/ol>\n<p>En raison de certaines des fonctionnalit\u00e9s les plus r\u00e9centes de jQuery, nous sommes en mesure de d\u00e9finir des \u00e9v\u00e9nements personnalis\u00e9s, puis de configurer des \u00e9couteurs et de les g\u00e9rer de mani\u00e8re appropri\u00e9e, mais le comportement g\u00e9n\u00e9ral reste le m\u00eame.<\/p>\n<p>Angular fonctionne un peu diff\u00e9remment, cependant.<\/p>\n<p>Pour rester simple (car rappelez-vous, j&rsquo;essaie juste de parcourir le processus pratique de d\u00e9clenchement d&rsquo;\u00e9v\u00e9nements Angular avec jQuery), Angular a un balisage un peu comme n&rsquo;importe quel document HTML standard avec une exception.<\/p>\n<p>\u00c0 savoir, tout balisage bas\u00e9 sur Angular est pilot\u00e9 par des attributs personnalis\u00e9s pr\u00e9fix\u00e9s par <strong>ng.<\/strong> Ceux-ci indiquent \u00e0 Angular d&rsquo;\u00e9couter certains \u00e9v\u00e9nements lorsqu&rsquo;ils se produisent et, lorsqu&rsquo;ils se produisent, d&rsquo;agir.<\/p>\n<p>Par exemple, s&rsquo;il y a un attribut sur un \u00e9l\u00e9ment qui ressemble <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-markup-example-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a><\/strong>\u00a0:<\/p>\n<pre><code>&lt;select class=\"form-control ng-pristine ng-untouched ng-valid ng-empty\" ng-model=\"item.payment_method\" ng-change=\"updatePaymentMethod(item)\" ng-options=\"method.display_name for method in paymentMethods track by method.id\"&gt;\n  &lt;!-- more to come --&gt;\n&lt;\/select&gt;<\/code><\/pre>\n<p>Ensuite, cela signifie que chaque fois que l&rsquo;\u00a0 \u00e9v\u00e9nement de <strong>changement<\/strong> est d\u00e9clench\u00e9, Angular doit d\u00e9clencher le gestionnaire appropri\u00e9 et faire tout ce qu&rsquo;il doit faire pour s&rsquo;assurer que les donn\u00e9es sont g\u00e9r\u00e9es correctement.<\/p>\n<p>Mais c&rsquo;est l\u00e0 que r\u00e9side la question initiale\u00a0: comment d\u00e9clencher des \u00e9v\u00e9nements angulaires avec jQuery\u00a0?<\/p>\n<h3>Un petit montage<\/h3>\n<p>Avant d&rsquo;entrer dans la fa\u00e7on de proc\u00e9der, je souhaite cr\u00e9er <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-markup-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un exemple de code<\/a><\/strong> bas\u00e9 sur Angular afin que nous soyons sur la m\u00eame page en ce qui concerne ce dont je parle:<\/p>\n<pre><code>&lt;select class=\"form-control ng-pristine ng-untouched ng-valid ng-empty\" ng-model=\"item.payment_method\" ng-change=\"updatePaymentMethod(item)\" ng-options=\"method.display_name for method in paymentMethods track by method.id\"&gt;\n  &lt;option value=\"?\"&gt;&lt;\/option&gt;\n  &lt;option value=\"1042\" selected=\"selected\"&gt;Card 1001 (01\/18)&lt;\/option&gt;\n&lt;\/select&gt;<\/code><\/pre>\n<p>En bref, il s&rsquo;agit d&rsquo;un \u00e9l\u00e9ment de s\u00e9lection avec un certain nombre d&rsquo;options. L&rsquo;objectif est double :<\/p>\n<ol>\n<li>modifier par programmation la valeur \u00e0 l&rsquo;aide de jQuery,<\/li>\n<li>envoyer les informations \u00e0 l&rsquo;aide des fonctions angulaires natives.<\/li>\n<\/ol>\n<p>Assez simple, non? Bien s\u00fbr, mais il y a quelques points \u00e0 noter et je les couvrirai dans la section suivante.<\/p>\n<h3>Maintenant \u00e0 jQuery<\/h3>\n<p>Maintenant, disons que nous allons faire quelque chose avec les\u00a0 \u00e9l\u00e9ments <strong>select<\/strong> mais nous n&rsquo;allons pas utiliser Angular. Au lieu de cela, nous allons utiliser jQuery.<\/p>\n<p>Mais en raison de la fa\u00e7on dont la solution a \u00e9t\u00e9 construite, Angular attend qu&rsquo;un\u00a0 \u00e9v\u00e9nement de <strong>changement<\/strong> soit d\u00e9clench\u00e9 sur le DOM pour que le framework puisse faire son travail. Mais jQuery fonctionne diff\u00e9remment, n&rsquo;est-ce pas? Au lieu de cela, il prend l&rsquo;\u00e9v\u00e9nement, utilise l&rsquo;abonn\u00e9 que nous avons configur\u00e9, puis le g\u00e8re.<\/p>\n<p>C&rsquo;est l\u00e0 que notre travail de d\u00e9clenchement d&rsquo;\u00e9v\u00e9nements Angular avec jQuery entre en jeu. Pour \u00eatre clair, ce n&rsquo;est pas aussi simple que d&rsquo;appeler du code via jQuery <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-jquery-change-event-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comme ceci<\/a><\/strong> :<\/p>\n<pre><code>$('select['ng-model=\"item.payment_method\"]').trigger('change');<\/code><\/pre>\n<p>Au lieu de cela, nous pouvons d\u00e9finir la valeur avec jQuery, mais nous devons ensuite utiliser Angular pour d\u00e9clencher le gestionnaire d&rsquo;\u00e9v\u00e9nements appropri\u00e9. C&rsquo;est toujours l&rsquo;\u00a0 \u00e9v\u00e9nement du <strong>changement<\/strong>, mais la fa\u00e7on dont nous le faisons est diff\u00e9rente.<\/p>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-change-event-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Dans le code suivant<\/a><\/strong>, vous verrez o\u00f9 je modifie l&rsquo;\u00e9l\u00e9ment select pour d\u00e9finir sa deuxi\u00e8me option comme option s\u00e9lectionn\u00e9e, puis demander \u00e0 Angular de faire son travail en d\u00e9clenchant l&rsquo; <strong>\u00e9v\u00e9nement change<\/strong> auquel l&rsquo;\u00e9l\u00e9ment est li\u00e9.<\/p>\n<pre><code>$('select[ng-model=\"schedule.payment_method\"]').each(function() {\n\n  \/\/ For the purposes of this example, we're going to select the first option.\n  $(this)\n    .children('option:eq(1)')\n    .attr('selected', 'selected');\n\n  \/\/ Make sure the select element reflects the change (as setting the option doesn't always do this properly).\n  $(this).val($(this).children('option:selected').attr('value'));\n\n  \/\/ Now use the Angular API's triggerHandler function to call the change.\n  angular.element($(this)).triggerHandler('change');\n});<\/code><\/pre>\n<p>Comme vous pouvez le voir, il n&rsquo;y a pas grand-chose de diff\u00e9rent ; cependant, plut\u00f4t que d&rsquo;appeler\u00a0 le <a href=\"https:\/\/api.jquery.com\/trigger\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">d\u00e9clencheur<\/a> sur l&rsquo;\u00e9l\u00e9ment via jQuery, nous utilisons l&rsquo;API fournie par Angular. Et cela s&rsquo;en occupera.<\/p>\n<h2>Utiliser judicieusement de telles techniques<\/h2>\n<p>Je ne suis pas un expert d&rsquo;Angular (et je n&rsquo;ai pas pr\u00e9tendu l&rsquo;\u00eatre), mais lorsqu&rsquo;il s&rsquo;agit de travailler avec une solution tierce personnalis\u00e9e fortement modifi\u00e9e et les outils dont je dispose ainsi que les contraintes de temps et de budget, c&rsquo;est utile savoir comment g\u00e9rer ces choses.<\/p>\n<p>Alors peut-\u00eatre que cela vous sera utile dans un futur projet.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai travaill\u00e9 un peu avec Angular. Et si vous \u00eates habitu\u00e9 \u00e0 ES6, \u00e0 JavaScript vanille ou \u00e0 l&rsquo;utilisation de jQuery, le d\u00e9clenchement d&rsquo;\u00e9v\u00e9nements angulaires avec jQuery peut sembler un peu bizarre au d\u00e9but.<\/p>\n","protected":false},"author":1,"featured_media":236442,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,728],"tags":[1167],"class_list":["post-230733","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-javascript-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=230733"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230733\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236442"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}