{"id":10056,"date":"2021-04-22T19:42:45","date_gmt":"2021-04-22T17:42:45","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=10056"},"modified":"2023-10-24T18:12:51","modified_gmt":"2023-10-24T16:12:51","slug":"dyrektywa-ngif-oraz-operator-sharereplay-czyli-jak-radzic-sobie-z-wielokrotnym-wykorzystaniem-observabla-w-templatce","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/dyrektywa-ngif-oraz-operator-sharereplay-czyli-jak-radzic-sobie-z-wielokrotnym-wykorzystaniem-observabla-w-templatce\/","title":{"rendered":"Dyrektywa *ngIf oraz operator shareReplay, czyli jak radzi\u0107 sobie z wielokrotnym wykorzystaniem observabla w templatce"},"content":{"rendered":"\n<p>W Angular jedn\u0105 z bardziej eleganckich metod subskrypcji do strumieni jest u\u017cycie <strong>async pipe<\/strong>.<br>Dzi\u0119ki temu nie potrzebujemy pami\u0119ta\u0107, aby si\u0119 odsubskrybowa\u0107 w metodzie ngOnDestroy i nie mamy potencjalnych wyciek\u00f3w pami\u0119ci.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;div class=&quot;company-address&quot;&gt;\n  &lt;h3&gt;Address&lt;\/h3&gt;\n  &lt;h4&gt;{{ company$ | async }}&lt;\/h4&gt;\n  &lt;p&gt;{{ address.city }} {{ address.zipCode }}&lt;\/p&gt;\n  &lt;p&gt;{{ address.street }}&lt;\/p&gt;\n  &lt;p&gt;{{ address.phone }}&lt;\/p&gt;\n&lt;\/div&gt;\n<\/pre><\/div>\n\n\n<p>Doskonale wiemy, \u017ce je\u017celi na widoku u\u017cyjemy w r\u00f3\u017cnych miejscach kilka razy <strong>async pipe<\/strong> dla tego samego observabla, to b\u0119dziemy mieli kilka subskrypcji (mo\u017cemy to zaobserwowa\u0107 m.in. w konsoli), co niestety obni\u017ca wydajno\u015b\u0107 naszej aplikacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wyzwanie:<\/strong><\/h2>\n\n\n\n<p>Co by by\u0142o, gdyby\u015bmy potrzebowali tego samego strumienia u\u017cy\u0107 w pi\u0119ciu albo dziesi\u0119ciu miejscach ?! \ud83d\ude42<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;p&gt;Conctact us: {{ (address$ | async).phone }} or email!&lt;\/p&gt;\n \n&lt;div *ngIf=&quot;address$ | async as address&quot; class=&quot;company-address&quot;&gt;\n  &lt;h3&gt;Address&lt;\/h3&gt;\n  &lt;h4&gt;{{ company$ | async }}&lt;\/h4&gt;\n  &lt;p&gt;{{ address.city }} {{ address.zipCode }}&lt;\/p&gt;\n  &lt;p&gt;{{ address.street }}&lt;\/p&gt;\n  &lt;p&gt;{{ address.phone }}&lt;\/p&gt;\n&lt;\/div&gt;\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/terminal-async.png\"><img decoding=\"async\" width=\"748\" height=\"253\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/terminal-async.png\" alt=\"\" class=\"wp-image-10101\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/terminal-async.png 748w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/terminal-async-300x101.png 300w\" sizes=\"(max-width: 748px) 100vw, 748px\" \/><\/a><\/figure>\n\n\n\n<p>Jak wida\u0107 na za\u0142\u0105czonym kodzie powy\u017cej, <em>address<\/em> zosta\u0142 pobrany dwukrotnie z uwagi na u\u017cycie dwa razy <strong>async pipe<\/strong>. Nie jest to dobra praktyka.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rozwi\u0105zanie 1:<\/h2>\n\n\n\n<p>Pomocna mo\u017ce by\u0107 tutaj dyrektywa strukturalna <strong>*ngIf<\/strong>. Mo\u017cna j\u0105 wykorzysta\u0107 np. do u\u017cycia observabli z async pipe w kilku miejscach jednocze\u015bnie w wygodny spos\u00f3b.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;ng-container *ngIf=&quot;address$ | async as address&quot;&gt;\n  &lt;p&gt;Conctact us: {{ address.phone }} or email!&lt;\/p&gt;\n   \n  &lt;div class=&quot;company-address&quot;&gt;\n    &lt;h3&gt;Address&lt;\/h3&gt;\n    &lt;h4&gt;{{ company$ | async }}&lt;\/h4&gt;\n    &lt;p&gt;{{ address.city }} {{ address.zipCode }}&lt;\/p&gt;\n    &lt;p&gt;{{ address.street }}&lt;\/p&gt;\n    &lt;p&gt;{{ address.phone }}&lt;\/p&gt;\n  &lt;\/div&gt;\n&lt;\/ng-container&gt;\n<\/pre><\/div>\n\n\n<p>Zalet\u0105 tego rozwi\u0105zania jest poprawienie jako\u015bci kodu, oraz jego wydajno\u015bci.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Rozwi\u0105zanie 2:<\/strong><\/h2>\n\n\n\n<p>Innym rozwi\u0105zaniem, kt\u00f3re mo\u017ce nam pom\u00f3c rozwi\u0105za\u0107 powy\u017csze wyzwanie, jest skorzystanie z jednego z operator\u00f3w RxJs, jakim jest <strong>shareReplay<\/strong>. Dzi\u0119ki cache-owaniu, zapami\u0119tuje on ostatnio przychodz\u0105ce wiadomo\u015bci, przez co nie powiela ponownego wys\u0142ania np. \u017c\u0105da\u0144 HTTP.<\/p>\n\n\n\n<p>Aby zapewni\u0107 unikni\u0119cie podw\u00f3jnej subskrypcji, wystarczy powy\u017cszy operator zastosowa\u0107 w nast\u0119puj\u0105cy spos\u00f3b. Wy\u015bwietli nam w konsoli tylko jedn\u0105 subskrypcj\u0119 do naszego adresu, mimo u\u017cycia kilku <strong>async pipe<\/strong> w widoku HTML.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nngOnInit(): void {\n  this.address$ = of(this.addressApi).pipe(\n     tap(address =&gt; console.log(&#039;address&#039;, address)),\n     shareReplay()\n  );\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie:<\/strong><\/h2>\n\n\n\n<p>Przedstawi\u0142em tutaj dwa sposoby na radzenie sobie z wielokrotnym wykorzystaniem strumieni. Oczywi\u015bcie, istniej\u0105 te\u017c inne mo\u017cliwo\u015bci rozwi\u0105zania tego samego problemu. \ud83d\ude42<\/p>\n\n\n\n<p>Je\u017celi potrzebujesz, ju\u017c teraz wykorzystaj kod i do\u0142\u0105cz do swojego projektu, nie robi\u0105c niepotrzebnych <strong>async pipe<\/strong> w wielu miejscach i popraw wydajno\u015b\u0107 swojej aplikacji.&nbsp;?<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;10056&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;1&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( vote: 1)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Dyrektywa *ngIf oraz operator shareReplay, czyli jak radzi\u0107 sobie z wielokrotnym wykorzystaniem observabla w templatce&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( vote: 1)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W Angular jedn\u0105 z bardziej eleganckich metod subskrypcji do strumieni jest u\u017cycie async pipe.Dzi\u0119ki temu nie potrzebujemy pami\u0119ta\u0107, aby si\u0119 &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/dyrektywa-ngif-oraz-operator-sharereplay-czyli-jak-radzic-sobie-z-wielokrotnym-wykorzystaniem-observabla-w-templatce\/\">Continued<\/a><\/p>\n","protected":false},"author":270,"featured_media":10490,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[867,202,18,111],"class_list":["post-10056","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-angular","tag-javascript","tag-javascript-frameworks","tag-web-development"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/bBlog.png","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10056"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/270"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=10056"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10056\/revisions"}],"predecessor-version":[{"id":25212,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10056\/revisions\/25212"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/10490"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=10056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=10056"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=10056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}