{"id":230209,"date":"2022-12-07T12:09:00","date_gmt":"2022-12-07T09:09:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230209"},"modified":"2022-12-07T11:49:08","modified_gmt":"2022-12-07T08:49:08","slug":"wyzwalanie-zdarzen-katowych-za-pomoca-jquery","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/wyzwalanie-zdarzen-katowych-za-pomoca-jquery\/","title":{"rendered":"Wyzwalanie zdarze\u0144 k\u0105towych za pomoc\u0105 jQuery"},"content":{"rendered":"\n<p>Jedn\u0105 z rzeczy, kt\u00f3re lubi\u0119 w pracy z WordPressem, jest mo\u017cliwo\u015b\u0107 wprowadzania bibliotek i narz\u0119dzi innych firm do pracy.<\/p>\n<p>Nie oznacza to, \u017ce nie przychodz\u0105 bez krzywej uczenia si\u0119 (wszyscy tak robi\u0105, prawda?), ale cz\u0119sto fajnie \u2013 cho\u0107 czasami frustruj\u0105ce \u2013 jest w\u0142\u0105czanie, a nast\u0119pnie manipulowanie tym, co robisz.<\/p>\n<p>Je\u015bli chodzi o technologie innych firm, widzia\u0142em, jak ludzie wprowadzaj\u0105 takie rzeczy, jak <strong><a href=\"https:\/\/packagist.org\/packages\/withfatpanda\/illuminate-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pakiet Laravel Illuminate<\/a><\/strong> z 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=\"Wyzwalanie zdarze\u0144 k\u0105towych za pomoc\u0105 jQuery\" ><\/a><\/p>\n<p>I wiem, zw\u0142aszcza w ostatnich latach, wielu wprowadzi\u0142o komponenty takie jak <strong><a href=\"https:\/\/reactjs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a><\/strong> i <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=\"Wyzwalanie zdarze\u0144 k\u0105towych za pomoc\u0105 jQuery\" ><\/a><\/p>\n<p>W jednym z takich przypadk\u00f3w pracowa\u0142em z <strong><a href=\"https:\/\/angular.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Angularem<\/a><\/strong>. A je\u015bli jeste\u015b przyzwyczajony do ES6, waniliowego JavaScriptu lub u\u017cywania jQuery, wyzwalanie zdarze\u0144 Angular za pomoc\u0105 jQuery mo\u017ce pocz\u0105tkowo wydawa\u0107 si\u0119 nieco dziwne.<\/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=\"Wyzwalanie zdarze\u0144 k\u0105towych za pomoc\u0105 jQuery\" ><\/a><\/p>\n<p>Ale kiedy zrozumiesz znaczniki i jak Angular obs\u0142uguje swoje zdarzenia, nie jest tak \u017ale.<\/p>\n<h2>Wyzwalanie zdarze\u0144 k\u0105towych za pomoc\u0105 jQuery<\/h2>\n<p>Angular dzia\u0142a nieco inaczej ni\u017c jQuery pod wzgl\u0119dem interakcji z DOM za ka\u017cdym razem, gdy ma miejsce zdarzenie.<\/p>\n<p>Na przyk\u0142ad za\u0142\u00f3\u017cmy, \u017ce u\u017cywaj\u0105c jQuery (lub nawet waniliowego JavaScript), mamy stron\u0119, a nast\u0119pnie na tej stronie znajduje si\u0119 zestaw znacznik\u00f3w, kt\u00f3ry mo\u017ce zawiera\u0107 r\u00f3\u017cne elementy. Mog\u0105 to by\u0107:<\/p>\n<ul>\n<li>nag\u0142\u00f3wki,<\/li>\n<li>akapity,<\/li>\n<li>etykiety,<\/li>\n<li>wybierz elementy,<\/li>\n<li>i tak dalej.<\/li>\n<\/ul>\n<p>Z jQuery jeste\u015bmy przyzwyczajeni do robienia czego\u015b takiego:<\/p>\n<ol>\n<li>znale\u017a\u0107 element, na kt\u00f3rym chcemy operowa\u0107 poprzez ID, nazw\u0119 klasy lub inny atrybut,<\/li>\n<li>nas\u0142uchiwa\u0107 wydarzenia,<\/li>\n<li>odpowiednio zareagowa\u0107.<\/li>\n<\/ol>\n<p>Ze wzgl\u0119du na niekt\u00f3re nowsze funkcje jQuery jeste\u015bmy w stanie zdefiniowa\u0107 zdarzenia niestandardowe, a nast\u0119pnie skonfigurowa\u0107 detektory i odpowiednio je obs\u0142u\u017cy\u0107, ale og\u00f3lne zachowanie jest nadal takie samo.<\/p>\n<p>Angular dzia\u0142a jednak nieco inaczej.<\/p>\n<p>Aby zachowa\u0107 prostot\u0119 (poniewa\u017c pami\u0119tam, po prostu pr\u00f3buj\u0119 przej\u015b\u0107 przez praktyczny proces wyzwalania zdarze\u0144 Angular za pomoc\u0105 jQuery), Angular ma znaczniki podobnie jak ka\u017cdy standardowy dokument HTML z wyj\u0105tkiem.<\/p>\n<p>Mianowicie, ka\u017cdy znacznik oparty na Angularze jest sterowany przez niestandardowe atrybuty, kt\u00f3re s\u0105 poprzedzone <strong>ng.<\/strong> M\u00f3wi\u0105 one Angularowi, aby nas\u0142uchiwa\u0142 pewnych zdarze\u0144, kiedy si\u0119 wydarzaj\u0105, a kiedy to si\u0119 dzieje, podejmuje dzia\u0142ania.<\/p>\n<p>Na przyk\u0142ad, je\u015bli w elemencie istnieje atrybut, kt\u00f3ry wygl\u0105da <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-markup-example-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/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>Oznacza to, \u017ce za ka\u017cdym razem, gdy\u00a0 wyzwalane jest zdarzenie <strong>zmiany<\/strong>, Angular musi uruchomi\u0107 odpowiedni\u0105 procedur\u0119 obs\u0142ugi i zrobi\u0107 wszystko, co konieczne, aby upewni\u0107 si\u0119, \u017ce dane s\u0105 obs\u0142ugiwane prawid\u0142owo.<\/p>\n<p>Ale tutaj le\u017cy pierwotne pytanie: jak mo\u017cemy wywo\u0142a\u0107 zdarzenia Angular za pomoc\u0105 jQuery?<\/p>\n<h3>Ma\u0142a konfiguracja<\/h3>\n<p>Zanim przejd\u0119 do tego, jak to zrobi\u0107, chc\u0119 utworzy\u0107 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-angular-markup-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">przyk\u0142adowy kod<\/a><\/strong> oparty na Angularze, wi\u0119c jeste\u015bmy na tej samej stronie w odniesieniu do tego, o czym m\u00f3wi\u0119:<\/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>Kr\u00f3tko m\u00f3wi\u0105c, jest to wybrany element z wieloma opcjami. Celem jest dwojakie:<\/p>\n<ol>\n<li>programowo zmie\u0144 warto\u015b\u0107 za pomoc\u0105 jQuery,<\/li>\n<li>wy\u015blij informacje za pomoc\u0105 natywnych funkcji Angulara.<\/li>\n<\/ol>\n<p>Wystarczaj\u0105co proste, prawda? Jasne, ale jest kilka rzeczy, na kt\u00f3re warto zwr\u00f3ci\u0107 uwag\u0119 i om\u00f3wi\u0119 je w nast\u0119pnej sekcji.<\/p>\n<h3>Teraz do jQuery<\/h3>\n<p>Za\u0142\u00f3\u017cmy teraz, \u017ce zamierzamy zrobi\u0107 co\u015b z <strong>wybranymi<\/strong> elementami, ale nie b\u0119dziemy u\u017cywa\u0107 Angulara. Zamiast tego b\u0119dziemy u\u017cywa\u0107 jQuery.<\/p>\n<p>Ale ze wzgl\u0119du na spos\u00f3b, w jaki zosta\u0142o zbudowane rozwi\u0105zanie, Angular czeka na wyzwolenie\u00a0 zdarzenia <strong>zmiany<\/strong> w DOM, aby framework m\u00f3g\u0142 wykona\u0107 swoje zadanie. Ale jQuery dzia\u0142a inaczej, prawda? Zamiast tego przyjmuje zdarzenie, wykorzystuje skonfigurowanego przez nas subskrybenta, a nast\u0119pnie go obs\u0142uguje.<\/p>\n<p>W tym momencie w gr\u0119 wchodzi nasza praca z wyzwalaniem zdarze\u0144 Angular za pomoc\u0105 jQuery. \u017beby by\u0142o jasne, nie jest to tak proste, jak wywo\u0142ywanie kodu przez jQuery w <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/3444d2be3556fc0c67036d5e3b2a6390#file-jquery-change-event-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ten<\/a><\/strong> spos\u00f3b :<\/p>\n<pre><code>$('select['ng-model=\"item.payment_method\"]').trigger('change');<\/code><\/pre>\n<p>Zamiast tego mo\u017cemy ustawi\u0107 warto\u015b\u0107 za pomoc\u0105 jQuery, ale nast\u0119pnie musimy u\u017cy\u0107 Angulara, aby wyzwoli\u0107 odpowiedni\u0105 obs\u0142ug\u0119 zdarze\u0144. To wci\u0105\u017c\u00a0 wydarzenie <strong>zmiany<\/strong>, ale spos\u00f3b, w jaki to robimy, jest inny.<\/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\">W poni\u017cszym kodzie<\/a><\/strong> zobaczysz, gdzie zmieniam element select, aby ustawi\u0107 jego drug\u0105 opcj\u0119 jako wybran\u0105 opcj\u0119, a nast\u0119pnie poinstruuj\u0119 Angular, aby wykona\u0142 swoje zadanie, wyzwalaj\u0105c <strong>zdarzenie change<\/strong>, z kt\u00f3rym element jest powi\u0105zany.<\/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>Jak wida\u0107, niewiele si\u0119 r\u00f3\u017cni; jednak zamiast wywo\u0142ywa\u0107 <a href=\"https:\/\/api.jquery.com\/trigger\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wyzwalacz<\/a> na elemencie za po\u015brednictwem jQuery, u\u017cywamy API dostarczanego przez Angular. I to si\u0119 tym zajmie.<\/p>\n<h2>Rozs\u0105dne korzystanie z takich technik<\/h2>\n<p>Nie jestem ekspertem Angular (ani nie twierdzi\u0142em, \u017ce jestem), ale je\u015bli chodzi o prac\u0119 z mocno zmodyfikowanym niestandardowym rozwi\u0105zaniem innej firmy i narz\u0119dziami, kt\u00f3re mam do dyspozycji wraz z ograniczeniami czasu i bud\u017cetu, jest to pomocne wiedzie\u0107, jak sobie z tym poradzi\u0107.<\/p>\n<p>By\u0107 mo\u017ce wi\u0119c pomo\u017ce ci to w przysz\u0142ym projekcie.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pracuj\u0119 troch\u0119 z Angularem. A je\u015bli jeste\u015b przyzwyczajony do ES6, waniliowego JavaScriptu lub u\u017cywania jQuery, wyzwalanie zdarze\u0144 Angular za pomoc\u0105 jQuery mo\u017ce pocz\u0105tkowo wydawa\u0107 si\u0119 nieco dziwne.<\/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":[721,732,897],"tags":[1169],"class_list":["post-230209","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-javascript-7","category-kod","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230209","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=230209"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230209\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236442"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230209"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}