{"id":231057,"date":"2022-12-07T11:56:00","date_gmt":"2022-12-07T08:56:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231057"},"modified":"2022-12-07T11:49:07","modified_gmt":"2022-12-07T08:49:07","slug":"attivazione-di-eventi-angolari-con-jquery","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/attivazione-di-eventi-angolari-con-jquery\/","title":{"rendered":"Attivazione di eventi angolari con jQuery"},"content":{"rendered":"\n<p>Una delle cose che mi piace di lavorare con WordPress \u00e8 la possibilit\u00e0 di inserire librerie e strumenti di terze parti con cui lavorare.<\/p>\n<p>Questo non significa che non arrivino senza la loro curva di apprendimento (lo fanno tutti, giusto?), ma \u00e8 spesso divertente, anche se a volte frustrante, incorporare e poi manipolare ci\u00f2 che stai facendo.<\/p>\n<p>Per quanto riguarda le tecnologie di terze parti, ho visto persone portare cose come <strong><a href=\"https:\/\/packagist.org\/packages\/withfatpanda\/illuminate-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il pacchetto Laravel Illuminate<\/a><\/strong> con 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=\"Attivazione di eventi angolari con jQuery\" ><\/a><\/p>\n<p>E so che, soprattutto negli ultimi anni, molti hanno introdotto componenti come <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=\"Attivazione di eventi angolari con jQuery\" ><\/a><\/p>\n<p>In uno di questi casi, ho lavorato con <strong><a href=\"https:\/\/angular.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Angular<\/a><\/strong>. E se sei abituato a ES6, JavaScript vanilla o usi jQuery, l&#8217;attivazione di eventi angolari con jQuery pu\u00f2 sembrare un po&#8217; strano all&#8217;inizio.<\/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=\"Attivazione di eventi angolari con jQuery\" ><\/a><\/p>\n<p>Ma una volta compreso il markup e il modo in cui Angular gestisce i suoi eventi, non \u00e8 cos\u00ec male.<\/p>\n<h2>Attivazione di eventi angolari con jQuery<\/h2>\n<p>Angular funziona in modo leggermente diverso rispetto a jQuery nel modo in cui interagisce con il DOM ogni volta che si verifica un evento.<\/p>\n<p>Ad esempio, diciamo che usando jQuery (o anche JavaScript vanilla), abbiamo una pagina e quindi all&#8217;interno di quella pagina c&#8217;\u00e8 un insieme di markup che pu\u00f2 includere una variet\u00e0 di elementi. Questi possono essere:<\/p>\n<ul>\n<li>titoli,<\/li>\n<li>paragrafi,<\/li>\n<li>etichette,<\/li>\n<li>selezionare gli elementi,<\/li>\n<li>e cos\u00ec via.<\/li>\n<\/ul>\n<p>Con jQuery, siamo abituati a fare qualcosa del genere:<\/p>\n<ol>\n<li>trova l&#8217;elemento su cui vogliamo operare tramite ID, nome della classe o qualche altro attributo,<\/li>\n<li>ascolta un evento,<\/li>\n<li>rispondere in modo appropriato.<\/li>\n<\/ol>\n<p>A causa di alcune delle nuove funzionalit\u00e0 di jQuery, siamo in grado di definire eventi personalizzati e quindi impostare listener e gestirli in modo appropriato, ma il comportamento generale \u00e8 sempre lo stesso.<\/p>\n<p>Angular funziona in modo leggermente diverso, per\u00f2.<\/p>\n<p>Per semplificare (perch\u00e9 ricorda, sto solo cercando di illustrare il processo pratico di attivazione di eventi angolari con jQuery), Angular ha un markup molto simile a qualsiasi documento HTML standard con un&#8217;eccezione.<\/p>\n<p>Vale a dire, qualsiasi markup basato su Angular \u00e8 guidato da attributi personalizzati che sono preceduti da <strong>ng.<\/strong> Questi dicono ad Angular di ascoltare determinati eventi quando accadono e, quando si verificano, di agire.<\/p>\n<p>Ad esempio, se c&#8217;\u00e8 un attributo su un elemento che assomiglia <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-markup-example-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a questo<\/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>Quindi significa che ogni volta che viene attivato l&#8217;\u00a0 evento di <strong>modifica<\/strong>, Angular deve attivare il gestore appropriato e fare tutto il necessario per assicurarsi che i dati vengano gestiti correttamente.<\/p>\n<p>Ma \u00e8 qui che si trova la domanda originale: come possiamo attivare eventi angolari con jQuery?<\/p>\n<h3>Un po&#8217; di configurazione<\/h3>\n<p>Prima di entrare in come farlo, voglio creare del <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-markup-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">codice<\/a><\/strong> di esempio basato su Angular, quindi siamo sulla stessa pagina per quanto riguarda ci\u00f2 di cui sto parlando:<\/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>In breve, questo \u00e8 un elemento selezionato con una serie di opzioni. L&#8217;obiettivo \u00e8 raddoppiare:<\/p>\n<ol>\n<li>modificare a livello di codice il valore usando jQuery,<\/li>\n<li>inviare le informazioni utilizzando le funzioni angolari native.<\/li>\n<\/ol>\n<p>Abbastanza semplice, giusto? Certo, ma ci sono alcune cose degne di nota e le tratter\u00f2 nella prossima sezione.<\/p>\n<h3>Ora a jQuery<\/h3>\n<p>Ora, diciamo che faremo qualcosa con gli\u00a0 elementi <strong>select<\/strong> ma non useremo Angular. Invece, useremo jQuery.<\/p>\n<p>Ma a causa del modo in cui \u00e8 stata creata la soluzione, Angular attende l&#8217;attivazione di un\u00a0 evento di <strong>modifica<\/strong> sul DOM in modo che il framework possa fare il suo dovere. Ma jQuery funziona in modo diverso, giusto? Invece, prende l&#8217;evento, usa l&#8217;abbonato che abbiamo impostato e quindi lo gestisce.<\/p>\n<p>\u00c8 qui che entra in gioco il nostro lavoro con l&#8217;attivazione di eventi angolari con jQuery. Per essere chiari, non \u00e8 semplice come chiamare il codice tramite jQuery in <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-jquery-change-event-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questo modo<\/a><\/strong> :<\/p>\n<pre><code>$('select['ng-model=\"item.payment_method\"]').trigger('change');<\/code><\/pre>\n<p>Invece, possiamo impostare il valore con jQuery ma poi dobbiamo usare Angular per attivare il corretto gestore di eventi. \u00c8 ancora l&#8217;\u00a0 evento del <strong>cambiamento<\/strong>, ma il modo in cui lo facciamo \u00e8 diverso.<\/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\">Nel codice seguente<\/a><\/strong>, vedrai dove sto modificando l&#8217;elemento select per impostare la sua seconda opzione come opzione selezionata e quindi istruire Angular a fare il suo lavoro attivando l&#8217; <strong>evento di modifica<\/strong> a cui \u00e8 associato l&#8217;elemento.<\/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>Come puoi vedere, non c&#8217;\u00e8 molto di diverso; tuttavia, anzich\u00e9 chiamare <a href=\"https:\/\/api.jquery.com\/trigger\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">trigger<\/a> sull&#8217;elemento tramite jQuery, utilizziamo l&#8217;API fornita da Angular. E questo se ne occuper\u00e0.<\/p>\n<h2>Usando giudiziosamente tali tecniche<\/h2>\n<p>Non sono un esperto di Angular (n\u00e9 ho affermato di esserlo), ma quando si tratta di lavorare con una soluzione personalizzata di terze parti pesantemente modificata e gli strumenti che ho a mia disposizione insieme ai vincoli di tempo e budget, \u00e8 utile sapere come gestire queste cose.<\/p>\n<p>Quindi forse questo ti sar\u00e0 di aiuto in un progetto futuro.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ho lavorato con Angular. E se sei abituato a ES6, JavaScript vanilla o usi jQuery, l&#8217;attivazione di eventi angolari con jQuery pu\u00f2 sembrare un po&#8217; strano all&#8217;inizio.<\/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":[896,731,720],"tags":[1168],"class_list":["post-231057","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-javascript-6","category-sviluppatore","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231057","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=231057"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231057\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/236442"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231057"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231057"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}