{"id":230486,"date":"2022-12-07T11:34:00","date_gmt":"2022-12-07T08:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230486"},"modified":"2022-12-07T11:49:00","modified_gmt":"2022-12-07T08:49:00","slug":"activacion-de-eventos-angulares-con-jquery","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/activacion-de-eventos-angulares-con-jquery\/","title":{"rendered":"Activaci\u00f3n de eventos angulares con jQuery"},"content":{"rendered":"\n<p>Una de las cosas que disfruto de trabajar con WordPress es la capacidad de incorporar bibliotecas y herramientas de terceros con las que trabajar.<\/p>\n<p>Esto no significa que no vengan sin su curva de aprendizaje (todos lo hacen, \u00bfverdad?), pero a menudo es divertido, aunque a veces frustrante, incorporar y luego manipular lo que est\u00e1s haciendo.<\/p>\n<p>En cuanto a las tecnolog\u00edas de terceros, he visto a personas traer cosas como <strong><a href=\"https:\/\/packagist.org\/packages\/withfatpanda\/illuminate-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el paquete 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=\"Activaci\u00f3n de eventos angulares con jQuery\" ><\/a><\/p>\n<p>Y s\u00e9 que, especialmente en los \u00faltimos a\u00f1os, muchos han incorporado componentes como <strong><a href=\"https:\/\/reactjs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a><\/strong> y <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=\"Activaci\u00f3n de eventos angulares con jQuery\" ><\/a><\/p>\n<p>En uno de esos casos, he estado trabajando con <strong><a href=\"https:\/\/angular.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Angular<\/a><\/strong>. Y si est\u00e1 acostumbrado a ES6, JavaScript est\u00e1ndar o jQuery, la activaci\u00f3n de eventos Angular con jQuery puede parecer un poco extra\u00f1o al principio.<\/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=\"Activaci\u00f3n de eventos angulares con jQuery\" ><\/a><\/p>\n<p>Pero una vez que comprende el marcado y c\u00f3mo Angular maneja sus eventos, no es tan malo.<\/p>\n<h2>Activaci\u00f3n de eventos angulares con jQuery<\/h2>\n<p>Angular funciona un poco diferente a jQuery en la forma en que interact\u00faa con el DOM cada vez que ocurre un evento.<\/p>\n<p>Por ejemplo, digamos que usando jQuery (o incluso JavaScript est\u00e1ndar), tenemos una p\u00e1gina y luego dentro de esa p\u00e1gina hay un conjunto de marcado que puede incluir una variedad de elementos. Estos pueden ser:<\/p>\n<ul>\n<li>encabezados,<\/li>\n<li>p\u00e1rrafos,<\/li>\n<li>etiquetas,<\/li>\n<li>seleccionar elementos,<\/li>\n<li>y as\u00ed.<\/li>\n<\/ul>\n<p>Con jQuery, estamos acostumbrados a hacer algo como esto:<\/p>\n<ol>\n<li>encontrar el elemento en el que queremos operar ya sea a trav\u00e9s de ID, nombre de clase o alg\u00fan otro atributo,<\/li>\n<li>escuchar un evento,<\/li>\n<li>responda apropiadamente.<\/li>\n<\/ol>\n<p>Debido a algunas de las caracter\u00edsticas m\u00e1s nuevas de jQuery, podemos definir eventos personalizados y luego configurar oyentes y manejarlos de manera adecuada, pero el comportamiento general sigue siendo el mismo.<\/p>\n<p>Sin embargo, Angular funciona un poco diferente.<\/p>\n<p>Para mantenerlo sencillo (porque recuerde, solo estoy tratando de recorrer el proceso pr\u00e1ctico de desencadenar eventos de Angular con jQuery), Angular tiene marcado como cualquier documento HTML est\u00e1ndar con una excepci\u00f3n.<\/p>\n<p>Es decir, cualquier marcado basado en Angular est\u00e1 impulsado por atributos personalizados que tienen el prefijo <strong>ng.<\/strong> Estos le dicen a Angular que escuche ciertos eventos cuando sucedan y, cuando lo hagan, que tome medidas.<\/p>\n<p>Por ejemplo, si hay un atributo en un elemento que se parece <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-markup-example-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a esto<\/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>Entonces significa que cada vez que se activa el\u00a0 evento de <strong>cambio<\/strong>, Angular debe activar el controlador apropiado y hacer lo que sea necesario para asegurarse de que los datos se manejen correctamente.<\/p>\n<p>Pero aqu\u00ed es donde radica la pregunta original: \u00bfC\u00f3mo podemos desencadenar eventos Angular con jQuery?<\/p>\n<h3>Un poco de configuraci\u00f3n<\/h3>\n<p>Antes de entrar en c\u00f3mo hacer esto, quiero crear <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-markup-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un c\u00f3digo de muestra<\/a><\/strong> basado en Angular para que estemos en la misma p\u00e1gina con respecto a lo que estoy hablando:<\/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 definitiva, se trata de un elemento selecto con una serie de opciones. El objetivo es doble:<\/p>\n<ol>\n<li>cambiar el valor mediante programaci\u00f3n usando jQuery,<\/li>\n<li>enviar la informaci\u00f3n usando funciones nativas de Angular.<\/li>\n<\/ol>\n<p>Bastante sencillo, \u00bfverdad? Claro, pero hay algunas cosas que vale la pena se\u00f1alar y las cubrir\u00e9 en la siguiente secci\u00f3n.<\/p>\n<h3>Ahora a jQuery<\/h3>\n<p>Ahora, digamos que vamos a hacer algo con los\u00a0 elementos <strong>seleccionados<\/strong> pero no vamos a usar Angular. En su lugar, vamos a utilizar jQuery.<\/p>\n<p>Pero debido a la forma en que se construy\u00f3 la soluci\u00f3n, Angular espera que se active un\u00a0 evento de <strong>cambio<\/strong> en el DOM para que el marco pueda hacer su trabajo. Pero jQuery funciona de manera diferente, \u00bfverdad? En cambio, toma el evento, usa el suscriptor que hemos configurado y luego lo maneja.<\/p>\n<p>Aqu\u00ed es donde entra en juego nuestro trabajo con la activaci\u00f3n de eventos Angular con jQuery. Para ser claros, no es tan simple como llamar al c\u00f3digo a trav\u00e9s de jQuery <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-jquery-change-event-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de esta manera<\/a><\/strong> :<\/p>\n<pre><code>$('select['ng-model=\"item.payment_method\"]').trigger('change');<\/code><\/pre>\n<p>En cambio, podemos establecer el valor con jQuery pero luego necesitamos usar Angular para activar el controlador de eventos adecuado. Sigue siendo el\u00a0 evento de <strong>cambio<\/strong>, pero la forma en que lo hacemos es 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\">En el siguiente c\u00f3digo<\/a><\/strong>, ver\u00e1 d\u00f3nde estoy cambiando el elemento de selecci\u00f3n para establecer su segunda opci\u00f3n como la opci\u00f3n seleccionada y luego instruir a Angular para que haga lo suyo activando el <strong>evento de cambio<\/strong> al que est\u00e1 vinculado el 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>Como puede ver, no hay mucho que sea diferente; sin embargo, en lugar de\u00a0 activar el <a href=\"https:\/\/api.jquery.com\/trigger\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desencadenador<\/a> en el elemento a trav\u00e9s de jQuery, usamos la API proporcionada por Angular. Y eso se encargar\u00e1 de eso.<\/p>\n<h2>Usando juiciosamente tales t\u00e9cnicas<\/h2>\n<p>No soy un experto en Angular (ni pretendo serlo), pero cuando se trata de trabajar con una soluci\u00f3n de terceros personalizada muy modificada y las herramientas que tengo a mi disposici\u00f3n junto con las limitaciones de tiempo y presupuesto, es \u00fatil saber manejar estas cosas.<\/p>\n<p>As\u00ed que quiz\u00e1s esto te sea de ayuda en un proyecto futuro.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>He estado trabajando con Angular. Y si est\u00e1 acostumbrado a ES6, JavaScript est\u00e1ndar o jQuery, la activaci\u00f3n de eventos Angular con jQuery puede parecer un poco extra\u00f1o al principio.<\/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":[892,716,727],"tags":[1172],"class_list":["post-230486","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-javascript-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230486","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=230486"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230486\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236442"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}