{"id":230871,"date":"2022-12-07T12:07:00","date_gmt":"2022-12-07T09:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230871"},"modified":"2022-12-07T11:49:09","modified_gmt":"2022-12-07T08:49:09","slug":"acionando-eventos-angulares-com-jquery","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/acionando-eventos-angulares-com-jquery\/","title":{"rendered":"Acionando eventos angulares com jQuery"},"content":{"rendered":"\n<p>Uma das coisas que eu gosto de trabalhar com o WordPress \u00e9 a capacidade de trazer bibliotecas e ferramentas de terceiros para trabalhar.<\/p>\n<p>Isso n\u00e3o significa que eles n\u00e3o v\u00eam sem sua curva de aprendizado (todos eles v\u00eam, certo?), mas muitas vezes \u00e9 divertido \u2013 embora frustrante, \u00e0s vezes \u2013 incorporar e manipular o que voc\u00ea est\u00e1 fazendo.<\/p>\n<p>No que diz respeito \u00e0s tecnologias de terceiros, vi pessoas trazendo coisas como <strong><a href=\"https:\/\/packagist.org\/packages\/withfatpanda\/illuminate-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o pacote Laravel Illuminate<\/a><\/strong> com o 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=\"Acionando eventos angulares com jQuery\" ><\/a><\/p>\n<p>E eu sei que, especialmente nos \u00faltimos anos, muitos trouxeram componentes como <strong><a href=\"https:\/\/reactjs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a><\/strong> e <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=\"Acionando eventos angulares com jQuery\" ><\/a><\/p>\n<p>Em um desses casos, tenho feito alguns trabalhos com <strong><a href=\"https:\/\/angular.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Angular<\/a><\/strong>. E se voc\u00ea est\u00e1 acostumado com ES6, JavaScript vanilla ou usando jQuery, ent\u00e3o acionar eventos Angular com jQuery pode parecer um pouco estranho no come\u00e7o.<\/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=\"Acionando eventos angulares com jQuery\" ><\/a><\/p>\n<p>Mas uma vez que voc\u00ea entende a marca\u00e7\u00e3o e como o Angular lida com seus eventos, n\u00e3o \u00e9 t\u00e3o ruim.<\/p>\n<h2>Acionando eventos angulares com jQuery<\/h2>\n<p>Angular funciona um pouco diferente do jQuery em como ele interage com o DOM sempre que um evento acontece.<\/p>\n<p>Por exemplo, digamos que usando jQuery (ou mesmo JavaScript vanilla), temos uma p\u00e1gina e dentro dessa p\u00e1gina h\u00e1 um conjunto de marca\u00e7\u00e3o que pode incluir uma variedade de elementos. Estes podem ser:<\/p>\n<ul>\n<li>t\u00edtulos,<\/li>\n<li>par\u00e1grafos,<\/li>\n<li>r\u00f3tulos,<\/li>\n<li>selecionar elementos,<\/li>\n<li>e assim por diante.<\/li>\n<\/ul>\n<p>Com jQuery, estamos acostumados a fazer algo assim:<\/p>\n<ol>\n<li>encontre o elemento no qual queremos operar via ID, nome de classe ou algum outro atributo,<\/li>\n<li>ouvir um evento,<\/li>\n<li>responder adequadamente.<\/li>\n<\/ol>\n<p>Por causa de alguns dos recursos mais recentes do jQuery, podemos definir eventos personalizados e, em seguida, configurar ouvintes e trat\u00e1-los adequadamente, mas o comportamento geral ainda \u00e9 o mesmo.<\/p>\n<p>Angular funciona um pouco diferente, no entanto.<\/p>\n<p>Para mant\u00ea-lo direto (porque lembre-se, estou apenas tentando percorrer o processo pr\u00e1tico de acionar eventos Angular com jQuery), Angular tem marca\u00e7\u00e3o muito parecida com qualquer documento HTML padr\u00e3o com uma exce\u00e7\u00e3o.<\/p>\n<p>Ou seja, qualquer marca\u00e7\u00e3o baseada em Angular \u00e9 orientada por atributos personalizados que s\u00e3o prefixados com <strong>ng.<\/strong> Eles dizem ao Angular para ouvir certos eventos quando eles acontecerem e, quando acontecerem, para agir.<\/p>\n<p>Por exemplo, se houver um atributo em um elemento <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-markup-example-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">parecido com este<\/a><\/strong> :<\/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>Isso significa que sempre que o\u00a0 evento de <strong>altera\u00e7\u00e3o<\/strong> \u00e9 acionado, o Angular precisa acionar o manipulador apropriado e fazer o que for necess\u00e1rio para garantir que os dados sejam tratados adequadamente.<\/p>\n<p>Mas \u00e9 a\u00ed que est\u00e1 a pergunta original: como podemos acionar eventos Angular com jQuery?<\/p>\n<h3>Um pouco de configura\u00e7\u00e3o<\/h3>\n<p>Antes de entrar em como fazer isso, quero criar <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-markup-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">um c\u00f3digo<\/a><\/strong> de exemplo baseado em Angular para que estejamos na mesma p\u00e1gina em rela\u00e7\u00e3o ao que estou falando:<\/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>Em suma, este \u00e9 um elemento select com v\u00e1rias op\u00e7\u00f5es. O objetivo \u00e9 duplo:<\/p>\n<ol>\n<li>alterar programaticamente o valor usando jQuery,<\/li>\n<li>envie as informa\u00e7\u00f5es usando fun\u00e7\u00f5es nativas do Angular.<\/li>\n<\/ol>\n<p>Simples o suficiente, certo? Claro, mas h\u00e1 algumas coisas dignas de nota e vou cobri-las na pr\u00f3xima se\u00e7\u00e3o.<\/p>\n<h3>Agora para jQuery<\/h3>\n<p>Agora, digamos que vamos fazer algo com os\u00a0 elementos <strong>select<\/strong>, mas n\u00e3o vamos usar o Angular. Em vez disso, usaremos jQuery.<\/p>\n<p>Mas, devido \u00e0 maneira como a solu\u00e7\u00e3o foi constru\u00edda, o Angular espera que um\u00a0 evento de <strong>altera\u00e7\u00e3o<\/strong> seja acionado no DOM para que o framework possa fazer o seu trabalho. Mas jQuery funciona de forma diferente, certo? Em vez disso, ele pega o evento, usa o assinante que configuramos e o manipula.<\/p>\n<p>\u00c9 aqui que entra o nosso trabalho com o acionamento de eventos Angular com jQuery. Para ser claro, n\u00e3o \u00e9 t\u00e3o simples quanto chamar c\u00f3digo 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\">assim<\/a><\/strong> :<\/p>\n<pre><code>$('select['ng-model=\"item.payment_method\"]').trigger('change');<\/code><\/pre>\n<p>Em vez disso, podemos definir o valor com jQuery, mas precisamos usar Angular para acionar o manipulador de eventos adequado. Ainda \u00e9 o\u00a0 evento de <strong>mudan\u00e7a<\/strong>, mas como fazemos isso \u00e9 diferente.<\/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\">No c\u00f3digo a seguir<\/a><\/strong>, voc\u00ea ver\u00e1 onde estou alterando o elemento select para definir sua segunda op\u00e7\u00e3o como a op\u00e7\u00e3o selecionada e, em seguida, instruir\u00e1 o Angular a fazer sua a\u00e7\u00e3o acionando o <strong>evento change<\/strong> ao qual o elemento est\u00e1 vinculado.<\/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>Como voc\u00ea pode ver, n\u00e3o h\u00e1 muita diferen\u00e7a; no entanto, em vez de chamar\u00a0 o <a href=\"https:\/\/api.jquery.com\/trigger\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">trigger<\/a> no elemento via jQuery, usamos a API fornecida pelo Angular. E isso vai cuidar disso.<\/p>\n<h2>Usando judiciosamente tais t\u00e9cnicas<\/h2>\n<p>N\u00e3o sou especialista em Angular (nem afirmei ser), mas quando se trata de trabalhar com uma solu\u00e7\u00e3o de terceiros personalizada fortemente modificada e as ferramentas que tenho \u00e0 minha disposi\u00e7\u00e3o, al\u00e9m das restri\u00e7\u00f5es de tempo e or\u00e7amento, \u00e9 \u00fatil saber como lidar com essas coisas.<\/p>\n<p>Ent\u00e3o talvez isso seja de ajuda para voc\u00ea em um projeto futuro.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eu tenho feito alguns trabalhos com Angular. E se voc\u00ea est\u00e1 acostumado com ES6, JavaScript vanilla ou usando jQuery, ent\u00e3o acionar eventos Angular com jQuery pode parecer um pouco estranho no come\u00e7o.<\/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":[898,722,733],"tags":[1170],"class_list":["post-230871","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-javascript-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=230871"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230871\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236442"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}