<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abdun Nahid</title>
    <description>The latest articles on DEV Community by Abdun Nahid (@abdunnahid).</description>
    <link>https://dev.to/abdunnahid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F326790%2Fbed76a31-e16e-4717-8ed5-f11a046ee2c1.JPG</url>
      <title>DEV Community: Abdun Nahid</title>
      <link>https://dev.to/abdunnahid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdunnahid"/>
    <language>en</language>
    <item>
      <title>Managing Angular Material table states with query params: a comprehensive guide</title>
      <dc:creator>Abdun Nahid</dc:creator>
      <pubDate>Fri, 14 Aug 2020 11:05:13 +0000</pubDate>
      <link>https://dev.to/abdunnahid/managing-angular-material-table-states-with-query-params-a-comprehensive-guide-1o8j</link>
      <guid>https://dev.to/abdunnahid/managing-angular-material-table-states-with-query-params-a-comprehensive-guide-1o8j</guid>
      <description>&lt;p&gt;I am asuming you already played around with &lt;a href="[https://material.angular.io/](https://material.angular.io/)"&gt;Angular Material&lt;/a&gt; or atleast know about it. Material &lt;a href="https://material.angular.io/components/table/overview" rel="noopener noreferrer"&gt;Table(MatTable)&lt;/a&gt; is an Angular Material module used for visualizing data as a table view. We can make MatTable more featureful by implementing sorting &amp;amp; pagination using &lt;a href="[https://material.angular.io/components/sort/overview](https://material.angular.io/components/sort/overview)"&gt;MatSort&lt;/a&gt; &amp;amp; &lt;a href="[https://material.angular.io/components/paginator/overview](https://material.angular.io/components/paginator/overview)"&gt;MatPaginator&lt;/a&gt; from Angular Material. I must say, MatTable is full of features. &lt;/p&gt;

&lt;p&gt;Along with all these features, if I don't add another one it feels incomplete to me. And that feature is having the table states back even if we refresh the page. Angular Material did not put in place this feature, but they have some useful API's that we will use to build the feature by ourselves. We are going to build a &lt;a href="https://angular.io/api/core/Directive" rel="noopener noreferrer"&gt;Directive&lt;/a&gt; that will take care of all the query params and table states.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Demo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0pm701ekfapoegg5vswt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0pm701ekfapoegg5vswt.gif" alt="Demo gif" width="1324" height="767"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Live Preview: &lt;a href="https://ng-hack.web.app/mat-table-query-reflector" rel="noopener noreferrer"&gt;https://ng-hack.web.app/mat-table-query-reflector&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note for Angular experts:&lt;/strong&gt; Though this guide is not meant for the Angular experts, I still urge you to go through and bless me with your valuable feedback&lt;/em&gt; 😇.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't like bla bla bla?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find the everything we coded here on &lt;a href="[https://github.com/abdunnahid/nghacks/tree/master/articles/mat-table-query-params](https://github.com/abdunnahid/nghacks/tree/master/articles/mat-table-query-params)"&gt;GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The directive is also built as an Angular Library: &lt;a href="[https://github.com/abdunnahid/nghacks/tree/master/main/projects/ngmat-table-query-reflector](https://github.com/abdunnahid/nghacks/tree/master/main/projects/ngmat-table-query-reflector)"&gt;Here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The library is also available on NPM: &lt;a href="[https://www.npmjs.com/package/@nghacks/ngmat-table-query-reflector](https://www.npmjs.com/package/@nghacks/ngmat-table-query-reflector)"&gt;@nghacks/ngmat-table-query-reflector&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;This is a part of GitHub &lt;a href="https://github.com/abdunnahid/nghacks" rel="noopener noreferrer"&gt;repo&lt;/a&gt;:
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/abdunnahid" rel="noopener noreferrer"&gt;
        abdunnahid
      &lt;/a&gt; / &lt;a href="https://github.com/abdunnahid/nghacks" rel="noopener noreferrer"&gt;
        nghacks
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Custom UI components built with Angular &amp;amp; Angular Material
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NgHacks&lt;/h1&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Custom UI components built with Angular &amp;amp; Angular Material&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3d3cefd85d26051b09bda566adf890d5fe35d1fed3aef6e74cecea1ff3043f0e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f616264756e6e616869642f6e676861636b73"&gt;&lt;img src="https://camo.githubusercontent.com/3d3cefd85d26051b09bda566adf890d5fe35d1fed3aef6e74cecea1ff3043f0e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f616264756e6e616869642f6e676861636b73" alt="GitHub commit activity"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bc5e6da8bb9fedb45ffe87aa413763a3d87ea731d49ba7e728cf281c01c33e6f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f43492532302d2532304d61696e2532304170703f6c6162656c3d776562253230707265766965772532306275696c64"&gt;&lt;img src="https://camo.githubusercontent.com/bc5e6da8bb9fedb45ffe87aa413763a3d87ea731d49ba7e728cf281c01c33e6f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f43492532302d2532304d61696e2532304170703f6c6162656c3d776562253230707265766965772532306275696c64" alt="GitHub Workflow Status"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c18cd32802cfeece6ab87bed9b761bc312bfc1d2414da3ccd8010c5590bf9f7a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f616264756e6e616869642f6e676861636b73"&gt;&lt;img src="https://camo.githubusercontent.com/c18cd32802cfeece6ab87bed9b761bc312bfc1d2414da3ccd8010c5590bf9f7a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f616264756e6e616869642f6e676861636b73" alt="GitHub"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Live Preview&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Browse: &lt;a href="https://ng-hack.web.app/" rel="nofollow noopener noreferrer"&gt;ng-hack.web.app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3877a6ab5ef467903b9e40a3f1ebcc427f8635b0066b9daf43b657886cb356d4/68747470733a2f2f696d672e736869656c64732e696f2f776562736974653f75726c3d68747470732533412532462532466e672d6861636b2e7765622e617070253246" alt="Website"&gt;&lt;/a&gt;
&lt;a href="https://ng-hack.web.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/04874513d5df830e7fcadad8341269ff7865184953fd6a8b2504144416bd7685/68747470733a2f2f696d672e736869656c64732e696f2f7733632d76616c69646174696f6e2f68746d6c3f7072657365743d48544d4c253243253230535647253230312e312532432532304d6174684d4c253230332e302674617267657455726c3d68747470732533412532462532466e672d6861636b2e7765622e617070253246" alt="W3C Validation"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Components&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/ngmat-table-query-reflector" rel="noopener noreferrer"&gt;ngmat-table-query-reflector&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Stores and retrieves mat table states (sorting, pagination) with url query params.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/mat-table-query-reflector" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can read that on my &lt;a href="https://dev.to/abdunnahid/managing-angular-material-table-states-with-query-params-a-comprehensive-guide-1o8j" rel="nofollow"&gt;blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/ngmat-table-query-reflector" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1fa0c5082c900440406e7f38ba6b460e1e49775f182170a9ada9e311b97f2b75/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f6e676d61742d7461626c652d71756572792d7265666c6563746f723f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/ngmat-table-query-reflector" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9497df034b4f6238b48ca357c2dccd69cd11f38fa59795baf7853676b4e37f1b/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f6e676d61742d7461626c652d71756572792d7265666c6563746f72" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f47fe96aefbf07824ea004be2b694fdfe12899cfd5a2c7606176590be0c1d9a7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276e676d61742d7461626c652d71756572792d7265666c6563746f72273f6c6162656c3d6275696c642532302532376e676d61742d7461626c652d71756572792d7265666c6563746f72253237"&gt;&lt;img src="https://camo.githubusercontent.com/f47fe96aefbf07824ea004be2b694fdfe12899cfd5a2c7606176590be0c1d9a7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276e676d61742d7461626c652d71756572792d7265666c6563746f72273f6c6162656c3d6275696c642532302532376e676d61742d7461626c652d71756572792d7265666c6563746f72253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/dynamic-browser-title" rel="noopener noreferrer"&gt;dynamic-browser-title&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Updates browser title dynamically &amp;amp; automatically on route change.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/dynamic-browser-title" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/dynamic-browser-title" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/29e9e495fe7d6fa095b819b5c54ef2b15cd8cdc12926a821d4794b8850a5b07e/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f64796e616d69632d62726f777365722d7469746c653f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/dynamic-browser-title" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9bb4b7d9da71fa694b3b9466592aae53cdf3cf129b2f25e54b7f668d0b4915c5/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f64796e616d69632d62726f777365722d7469746c65" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bf696e3e712058884a75d3ab0d50d18913e4e3becb3ee0648a7a7a0ee870e9a3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302764796e616d69632d62726f777365722d7469746c65273f6c6162656c3d6275696c6425323025323764796e616d69632d62726f777365722d7469746c65253237"&gt;&lt;img src="https://camo.githubusercontent.com/bf696e3e712058884a75d3ab0d50d18913e4e3becb3ee0648a7a7a0ee870e9a3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302764796e616d69632d62726f777365722d7469746c65273f6c6162656c3d6275696c6425323025323764796e616d69632d62726f777365722d7469746c65253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/uploader" rel="noopener noreferrer"&gt;uploader&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Picks image or file&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/uploader" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/uploader" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7358ef23c07d294d337e590c96ad1dd25242645a2982d6de9c66deca1d0737d5/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f75706c6f616465723f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/uploader" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4269714ba714da9003028b0e28126ca420103e7f1aab74d80d3745a2bfd1bcf8/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f75706c6f61646572" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7c80ab52f881b7739d62919f967ec65e44f817af01fe5a3a78978956df96b583/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302775706c6f61646572273f6c6162656c3d6275696c6425323025323775706c6f61646572253237"&gt;&lt;img src="https://camo.githubusercontent.com/7c80ab52f881b7739d62919f967ec65e44f817af01fe5a3a78978956df96b583/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302775706c6f61646572273f6c6162656c3d6275696c6425323025323775706c6f61646572253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/info-dialog" rel="noopener noreferrer"&gt;info-dialog&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Shows detail information on a dialog/modal&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/info-dialog" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/info-dialog" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d7f1d79afcf0637c21a2d22ade74fc38422e48f348b527d68730967c4cde2b2d/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f696e666f2d6469616c6f673f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/info-dialog" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/eaa93a98261cdb6b7006d541a890dab0ded2ad9b77186dd59fea6cd059ece942/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f696e666f2d6469616c6f67" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/54482609f0292e20cd73df573436dde770c6a1928b52d3b1123b397d382e7047/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696e666f2d6469616c6f67273f6c6162656c3d6275696c64253230253237696e666f2d6469616c6f67253237"&gt;&lt;img src="https://camo.githubusercontent.com/54482609f0292e20cd73df573436dde770c6a1928b52d3b1123b397d382e7047/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696e666f2d6469616c6f67273f6c6162656c3d6275696c64253230253237696e666f2d6469616c6f67253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/image-viewer" rel="noopener noreferrer"&gt;image-viewer&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Shows full size image in a overlay maintaining the aspect ratio.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/image-viewer" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/image-viewer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a6096f6c3909a1587b87868bdf87166c7a81091f8b2dba1032a3ce2eedffb1fd/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f696d6167652d7669657765723f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/image-viewer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b58379c03dc43c40cfc783da101e8eee6225b7b007421a542866525a077f51f0/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f696d6167652d766965776572" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/377036c9dacf6bec5db734938721d7ebd767c5b826bfcce4dacde601035e4cb8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696d6167652d766965776572273f6c6162656c3d6275696c64253230253237696d6167652d766965776572253237"&gt;&lt;img src="https://camo.githubusercontent.com/377036c9dacf6bec5db734938721d7ebd767c5b826bfcce4dacde601035e4cb8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696d6167652d766965776572273f6c6162656c3d6275696c64253230253237696d6167652d766965776572253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/quantity-input" rel="noopener noreferrer"&gt;quantity-input&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Quantity input for shopping cart.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/quantity-input" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/quantity-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f8d7400d034cc8e3aa50ed6d4c30ee015f4839d4e9bedd6a49e135efaa7dc1a0/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f7175616e746974792d696e7075743f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/quantity-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/352b1d09954d6a867b20a96f26f55b25d3e59c82f77a7ae77d1a495647c69b05/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f7175616e746974792d696e707574" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4802b804bbfeb4109010d10fe8b843890c5bcaadfcaf1e4358ec7d586f699f2a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230277175616e746974792d696e707574273f6c6162656c3d6275696c642532302532377175616e746974792d696e707574253237"&gt;&lt;img src="https://camo.githubusercontent.com/4802b804bbfeb4109010d10fe8b843890c5bcaadfcaf1e4358ec7d586f699f2a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230277175616e746974792d696e707574273f6c6162656c3d6275696c642532302532377175616e746974792d696e707574253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/rating-input" rel="noopener noreferrer"&gt;rating-input&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Rating input for products/services.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/rating-input" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/rating-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bca2b83199a54925a1a40066401ef59caf93f9ce76f661d19a7be38489c0dace/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f726174696e672d696e7075743f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/rating-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/307adf3eff390116c7cb24fee507b0ac48eaace43386a34d5e673a2de2b5a7a1/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f726174696e672d696e707574" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/27e2dd1cea7e95c97c6e2b207caead50fbe67673c5930af0944f94391c061682/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027726174696e672d696e707574273f6c6162656c3d6275696c64253230253237726174696e672d696e707574253237"&gt;&lt;img src="https://camo.githubusercontent.com/27e2dd1cea7e95c97c6e2b207caead50fbe67673c5930af0944f94391c061682/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027726174696e672d696e707574273f6c6162656c3d6275696c64253230253237726174696e672d696e707574253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/banner-carousel" rel="noopener noreferrer"&gt;banner-carousel&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Image carousel for web page banner.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/banner-carousel" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/banner-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cc427dede27a647f4d49b5873b14c39314d743496ec26eee2b1e76d092fd0c3b/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f62616e6e65722d6361726f7573656c3f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/banner-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7b5bdbddd501dd3db21e141b4a784b391db30a960749847f8e21789ba8029685/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f62616e6e65722d6361726f7573656c" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4e43f57353b6d46db744dc32ef16798f5ec58c8fd20e43d47d4b82ed71962ac5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302762616e6e65722d6361726f7573656c273f6c6162656c3d6275696c6425323025323762616e6e65722d6361726f7573656c253237"&gt;&lt;img src="https://camo.githubusercontent.com/4e43f57353b6d46db744dc32ef16798f5ec58c8fd20e43d47d4b82ed71962ac5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302762616e6e65722d6361726f7573656c273f6c6162656c3d6275696c6425323025323762616e6e65722d6361726f7573656c253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/overflow-carousel" rel="noopener noreferrer"&gt;overflow-carousel&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Show overflowing content as carousel.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/overflow-carousel" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/overflow-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/299938cd8862f1a00605f9f3b957adf0f2f86c263f439f9a2f8a2a814d6a07d5/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f6f766572666c6f772d6361726f7573656c3f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/overflow-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3f575ea499ce7af1540573d583c179a98acbc33e15db37a32b11363f8d8534d1/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f6f766572666c6f772d6361726f7573656c" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/469ec8aa004d0645194848c5f5713ceb0d608a5b05646face8516848290b6463/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276f766572666c6f772d6361726f7573656c273f6c6162656c3d6275696c642532302532376f766572666c6f772d6361726f7573656c253237"&gt;&lt;img src="https://camo.githubusercontent.com/469ec8aa004d0645194848c5f5713ceb0d608a5b05646face8516848290b6463/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276f766572666c6f772d6361726f7573656c273f6c6162656c3d6275696c642532302532376f766572666c6f772d6361726f7573656c253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/abdunnahid/nghacks" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Live on &lt;a href="[https://ng-hack.web.app/mat-table-query-reflector](https://ng-hack.web.app/mat-table-query-reflector)"&gt;web&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So let's jump into coding and build a query param manager directive for MatTable. &lt;/p&gt;

&lt;h2&gt;
  
  
  Initial Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="[https://angular.io/guide/setup-local](https://angular.io/guide/setup-local)"&gt;Install Angular &amp;amp; create a new project&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;To follow along use angular 10.x&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @angular/cli
ng new MaterialTableQueryParamExample
? Would you like to add Angular routing? &lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt; n
? Which stylesheet format would you like to use? scss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;a href="[https://material.angular.io/guide/getting-started](https://material.angular.io/guide/getting-started)"&gt;Add Angular Material to the created project&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;MaterialTableQueryParamExample
ng add @angular/material
? Choose a prebuilt theme name, or &lt;span class="s2"&gt;"custom"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;a custom theme: Indigo/Pink
? Set up global Angular Material typography styles? Yes
? Set up browser animations &lt;span class="k"&gt;for &lt;/span&gt;Angular Material? Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Import RouterModule, MatTableModule, MatSortModule,MatPaginatorModule&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;app.module.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BrowserModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/platform-browser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NgModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AppComponent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BrowserAnimationsModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/platform-browser/animations&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RouterModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/router&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MatTableModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/material/table&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MatSortModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/material/sort&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MatPaginatorModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/material/paginator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NgMatTableQueryReflectorDirective&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./directives/ng-mat-table-query-reflector.directive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;declarations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;AppComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;NgMatTableQueryReflectorDirective&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;BrowserModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;BrowserAnimationsModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;RouterModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forRoot&lt;/span&gt;&lt;span class="p"&gt;([]),&lt;/span&gt;
    &lt;span class="nx"&gt;MatTableModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;MatSortModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;MatPaginatorModule&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="na"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;AppComponent&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppModule&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Table templating&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;app.component.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"table-container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;table&lt;/span&gt; &lt;span class="na"&gt;mat-table&lt;/span&gt; &lt;span class="na"&gt;[dataSource]=&lt;/span&gt;&lt;span class="s"&gt;"dataSource"&lt;/span&gt; &lt;span class="na"&gt;matSort&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Position Column --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ng-container&lt;/span&gt; &lt;span class="na"&gt;matColumnDef=&lt;/span&gt;&lt;span class="s"&gt;"position"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;mat-header-cell&lt;/span&gt; &lt;span class="na"&gt;*matHeaderCellDef&lt;/span&gt; &lt;span class="na"&gt;mat-sort-header&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Position &lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;mat-cell&lt;/span&gt; &lt;span class="na"&gt;*matCellDef=&lt;/span&gt;&lt;span class="s"&gt;"let element"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; {{element.position}} &lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ng-container&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Name Column --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ng-container&lt;/span&gt; &lt;span class="na"&gt;matColumnDef=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;mat-header-cell&lt;/span&gt; &lt;span class="na"&gt;*matHeaderCellDef&lt;/span&gt; &lt;span class="na"&gt;mat-sort-header&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Name &lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;mat-cell&lt;/span&gt; &lt;span class="na"&gt;*matCellDef=&lt;/span&gt;&lt;span class="s"&gt;"let element"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; {{element.name}} &lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ng-container&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;tr&lt;/span&gt; &lt;span class="na"&gt;mat-header-row&lt;/span&gt; &lt;span class="na"&gt;*matHeaderRowDef=&lt;/span&gt;&lt;span class="s"&gt;"displayedColumns"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;tr&lt;/span&gt; &lt;span class="na"&gt;mat-row&lt;/span&gt; &lt;span class="na"&gt;*matRowDef=&lt;/span&gt;&lt;span class="s"&gt;"let row; columns: displayedColumns;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;mat-paginator&lt;/span&gt; &lt;span class="na"&gt;[pageSizeOptions]=&lt;/span&gt;&lt;span class="s"&gt;"[10, 5, 3]"&lt;/span&gt; &lt;span class="na"&gt;showFirstLastButtons&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/mat-paginator&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Initializing table data source&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;app.component.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;OnInit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ViewChild&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MatTableDataSource&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/material/table&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MatPaginator&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/material/paginator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MatSort&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/material/sort&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;styleUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.component.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppComponent&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;OnInit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ViewChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MatPaginator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;static&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="nx"&gt;paginator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MatPaginator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ViewChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MatSort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;static&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MatSort&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;displayedColumns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;position&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nl"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MatTableDataSource&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PeriodicElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;ngOnInit&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;MatTableDataSource&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PeriodicElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ELEMENT_DATA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paginator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paginator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;PeriodicElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ELEMENT_DATA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PeriodicElement&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hydrogen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Helium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lithium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Beryllium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Boron&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Carbon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nitrogen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Oxygen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Fluorine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Neon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Add some styling to make it look not too bad&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;app.component.scss&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.table-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="err"&gt;table&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;-2px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;.14&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;.12&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Run the project
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng serve &lt;span class="nt"&gt;--o&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The initial setup is done. It should render a table. You can change page index, page size, and sorting. If you refresh the page all your changes are gone. That's the problem we are going to fix next.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cut the crap, show me the real thing
&lt;/h2&gt;

&lt;p&gt;As planned we will solve them with a &lt;a href="[https://angular.io/api/core/Directive](https://angular.io/api/core/Directive)"&gt;directive&lt;/a&gt;. Let's first create one.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating the directive
&lt;/h3&gt;

&lt;p&gt;Create a directive using angular CLI. Let's name it NgMatTableQueryReflector and place it under /directives directory.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng generate directive directives/NgMatTableQueryReflector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This command created a directive and registered it to AppModule declarations. The directive should look something like,&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Directive&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Directive&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[appNgMatTableQueryReflector]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NgMatTableQueryReflectorDirective&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Put this directive on table tag on template.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;table&lt;/span&gt;  &lt;span class="na"&gt;mat-table&lt;/span&gt;  &lt;span class="na"&gt;[dataSource]=&lt;/span&gt;&lt;span class="s"&gt;"dataSource"&lt;/span&gt;  &lt;span class="na"&gt;matSort&lt;/span&gt;  &lt;span class="na"&gt;appNgMatTableQueryReflector&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now we have access to all the other directives and input properties in our &lt;em&gt;&lt;strong&gt;NgMatTableQueryReflectorDirective.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Identifying the requirements
&lt;/h3&gt;

&lt;p&gt;Think about the requirements. What behavior we actually want? Let's focus on the sorting behavior for now,&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If a user changes the active sort column or the sort direction, changes should reflect on the URL with query params.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;For example user sorted the table by position in descending order. Our URL should change and look something like: &lt;/p&gt;

&lt;p&gt;&lt;a href="http://localhost:4200/?sort_active=position&amp;amp;sort_direction=desc" rel="noopener noreferrer"&gt;http://localhost:4200/?sort_active=position&amp;amp;sort_direction=desc&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;If the user reloads the page with those changes, the table should render sorted by position in descending order.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Building the logic
&lt;/h3&gt;

&lt;p&gt;What are the things we actually need to fulfill the requirements? &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We need a sort change event source. &lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Why? That source will let us know when the user changes the sorting then we can update our URL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Another thing we need is to set sorting states.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Why? Because, on the app load, if we find anything for the sorting on URL, we need to update the sorting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And think what? Angular Material already has that API's to make our life easier. &lt;br&gt;
What is that API? It is &lt;em&gt;&lt;strong&gt;MatTableDataSource&lt;/strong&gt;&lt;/em&gt; that we get as an input from the template named as &lt;em&gt;&lt;strong&gt;dataSource&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Listen to sort change event &amp;amp; update URL
&lt;/h4&gt;

&lt;p&gt;Take &lt;em&gt;&lt;strong&gt;dataSource&lt;/strong&gt;&lt;/em&gt; as an input. Inject the routing dependencies to constructor&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MatTableDataSource&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;_router&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;_activatedRoute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ActivatedRoute&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;First, listen to the sort change events on &lt;em&gt;&lt;strong&gt;ngAfterViewInit&lt;/strong&gt;&lt;/em&gt; lifecycle hook.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;ngAfterViewInit&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listenToStateChangeEvents&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;listenToStateChangeEvents&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sortChange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;sortChange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Sort&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Update URL with the changed sort states&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then update the URL query params&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;listenToStateChangeEvents&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sortChange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;sortChange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Sort&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_applySortChangesToUrlQueryParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pageChange&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;_applySortChangesToUrlQueryParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sortChange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Sort&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sortingAndPaginationQueryParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;sort_active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sortChange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;sort_direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sortChange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;([],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
   &lt;span class="na"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sortingAndPaginationQueryParams&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
   &lt;span class="na"&gt;queryParamsHandling&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;merge&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Note: We used &lt;code&gt;queryParamsHandling:  'merge'&lt;/code&gt;. We don't want our sort query params to break other query params on the URL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Check that out changing the sorting states. It reflects on the URL, right?&lt;br&gt;
Cool! let's make the URL reflects on the table too.&lt;/p&gt;
&lt;h4&gt;
  
  
  Apply initial sort query params to table
&lt;/h4&gt;

&lt;p&gt;Read query params on app load in &lt;em&gt;&lt;strong&gt;ngAfterViewInit&lt;/strong&gt;&lt;/em&gt; lifecycle hook.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="nf"&gt;ngAfterViewInit&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_initialSetup&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listenToStateChangeEvents&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;initialSetup&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;activeSortQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;NgMatTableQueryReflectorDirective -&amp;gt; _initialSetup -&amp;gt; activeSortQuery&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;sort_active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sort_direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;asc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;queryParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_activatedRoute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasOwnProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sort_active&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasOwnProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sort_direction&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;sort_active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort_active&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;sort_direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort_direction&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now we should get our sort query params inside &lt;em&gt;&lt;strong&gt;initialSetup()&lt;/strong&gt;&lt;/em&gt;. But if you try reloading the page, you can see &lt;code&gt;undefined&lt;/code&gt; on the console though we have query params present on the URL! &lt;/p&gt;

&lt;p&gt;Because we used &lt;code&gt;this._activatedRoute.snapshot&lt;/code&gt; to get query params. &lt;code&gt;snapshot.queryParams&lt;/code&gt; returns query params present at that moment when it is called. The moment we called &lt;code&gt;snapshot&lt;/code&gt;, Angular router is not aware of the query params. So it returns &lt;code&gt;undefined&lt;/code&gt; instead of the query params. We could use &lt;code&gt;this._activatedRoute.paramMap&lt;/code&gt;. But this emits value on every URL param change. We don't need that, we only need to know the query params on app load. So let's fix it.&lt;/p&gt;
&lt;h4&gt;
  
  
  Here comes the Hack
&lt;/h4&gt;

&lt;p&gt;We will fix this by waiting until the angular router initializes the query params.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;waitForQueryParamsToLoad&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;titleCheckingInterval$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="na"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Subscription&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;subscription&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;titleCheckingInterval$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_activatedRoute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unsubscribe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We decided to wait only if we find query params in &lt;code&gt;window.location&lt;/code&gt;, otherwise no need to wait. &lt;code&gt;window.location&lt;/code&gt; is available even before angular loads. So no tension about loading &lt;code&gt;window.location&lt;/code&gt; this time. We used a handy tool &lt;a href="[https://www.learnrxjs.io/learn-rxjs/operators/creation/interval](https://www.learnrxjs.io/learn-rxjs/operators/creation/interval)"&gt;&lt;code&gt;interval&lt;/code&gt;&lt;/a&gt; from &lt;a href="[[https://rxjs.dev/](https://rxjs.dev/)]"&gt;&lt;strong&gt;rxjs&lt;/strong&gt;&lt;/a&gt; to check with an interval.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Please consider using the &lt;code&gt;window&lt;/code&gt; object directly on Angular. Directly using &lt;code&gt;window&lt;/code&gt; is not a good idea!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Call this method we just wrote before getting the query params. &lt;code&gt;await&lt;/code&gt; for &lt;code&gt;waitForQueryParamsToLoad()&lt;/code&gt; and &lt;code&gt;async&lt;/code&gt; for &lt;code&gt;initialSetup()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;initialSetup&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// HACK&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForQueryParamsToLoad&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;activeSortQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;NgMatTableQueryReflectorDirective -&amp;gt; _initialSetup -&amp;gt; activeSortQuery&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now our &lt;code&gt;activeSortQuery&lt;/code&gt; getter returns an expected value. Nice!&lt;/p&gt;

&lt;p&gt;The last thing we need is to apply our sort states from query param to the &lt;code&gt;MatSort&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;initialSetup&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// HACK&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForQueryParamsToLoad&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;activeSortQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;sortable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MatSortable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort_active&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort_direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;disableClear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sortable&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now everything should work fine but no it doesn't! There is an &lt;a href="https://github.com/angular/components/issues/10242" rel="noopener noreferrer"&gt;issue&lt;/a&gt; with the &lt;code&gt;MatSort&lt;/code&gt;. We need to do another hack! This &lt;a href="https://github.com/angular/components/issues/10242#issuecomment-421490991" rel="noopener noreferrer"&gt;hack&lt;/a&gt; was invented on that issue. &lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/angular/components/issues/10242" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        [Sort] Programatically setting active/direction does not update UI
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#10242&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/shahmirn" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F3029066%3Fv%3D4" alt="shahmirn avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/shahmirn" rel="noopener noreferrer"&gt;shahmirn&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/angular/components/issues/10242" rel="noopener noreferrer"&gt;&lt;time&gt;Mar 02, 2018&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;h4&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Bug, feature request, or proposal:&lt;/h4&gt;
&lt;p&gt;I'm programmatically setting the active and direction on matSort, but it's not updating the UI&lt;/p&gt;
&lt;h4&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;What is the expected behavior?&lt;/h4&gt;
&lt;p&gt;programmatically setting the active and direction on matSort updates the UI&lt;/p&gt;
&lt;h4&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;What is the current behavior?&lt;/h4&gt;
&lt;p&gt;programmatically setting the active and direction on matSort, but it's not updating the UI&lt;/p&gt;
&lt;h4&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;What are the steps to reproduce?&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://stackblitz.com/edit/angular-material2-issue-mc4cve?file=app/app.component.ts" rel="nofollow noopener noreferrer"&gt;https://stackblitz.com/edit/angular-material2-issue-mc4cve?file=app/app.component.ts&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;What is the use-case or motivation for changing an existing behavior?&lt;/h4&gt;
&lt;p&gt;I believe this is a regression. This was working in 5.1.0&lt;/p&gt;
&lt;h4&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Which versions of Angular, Material, OS, TypeScript, browsers are affected?&lt;/h4&gt;
&lt;h4&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Is there anything else we should know?&lt;/h4&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/angular/components/issues/10242" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/angular/components/issues/10242#issuecomment-421490991" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Comment for
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#10242&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/adgoncal" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F10856791%3Fu%3D921c7faf87876f8934f9bbb1cd7639605b9c75b2%26v%3D4" alt="adgoncal avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/adgoncal" rel="noopener noreferrer"&gt;adgoncal&lt;/a&gt;
        &lt;/strong&gt; commented on &lt;a href="https://github.com/angular/components/issues/10242#issuecomment-421490991" rel="noopener noreferrer"&gt;&lt;time&gt;Sep 14, 2018&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;I spent some time debugging this. Here are my observations:&lt;/p&gt;
&lt;p&gt;When you click on a &lt;code&gt;mat-sort-header&lt;/code&gt; that is not currently active, eventually it will call &lt;code&gt;_setAnimationTransitionState({fromState: '&amp;lt;direction&amp;gt;', toState: 'active'})&lt;/code&gt; on the clicked &lt;code&gt;mat-sort-header&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;However, when you programmatically call &lt;code&gt;matSort.sort({...})&lt;/code&gt;, the &lt;code&gt;mat-sort-header&lt;/code&gt; that should become active never calls &lt;code&gt;_setAnimationTransitionState()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I believe this is an issue on &lt;code&gt;_rerenderSubscription()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I managed to make it work with the following ugly hack:&lt;/p&gt;
&lt;div class="highlight highlight-source-js js-code-highlight"&gt;
&lt;pre&gt;    &lt;span class="pl-smi"&gt;this&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;matSort&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;sort&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;
      &lt;span class="pl-c1"&gt;id&lt;/span&gt;: &lt;span class="pl-c1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;value&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;gt;&lt;/span&gt;,
      start: &lt;span class="pl-c1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;direction&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;gt;&lt;/span&gt;,
      disableClear: true,
    &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;&lt;span class="pl-c"&gt;&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;/span&gt;
&lt;span class="pl-c"&gt;    // ugly hack!&lt;/span&gt;
    const activeSortHeader = this.matSort.sortables.get(value);
    activeSortHeader['_setAnimationTransitionState'](&lt;span class="pl-kos"&gt;{&lt;/span&gt;
      &lt;span class="pl-s1"&gt;fromState&lt;/span&gt;: &lt;span class="pl-c1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-s1"&gt;direction&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
      &lt;span class="pl-s1"&gt;toState&lt;/span&gt;: &lt;span class="pl-s"&gt;'active'&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://stackblitz.com/edit/angular-vuvckf?file=app%2Ftable-overview-example.ts" rel="nofollow noopener noreferrer"&gt;https://stackblitz.com/edit/angular-vuvckf?file=app%2Ftable-overview-example.ts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/angular/material2/blob/9ab2c905e2e81999347742f880bfd851f9e32022/src/lib/sort/sort-header.ts#L230" rel="noopener noreferrer"&gt;https://github.com/angular/material2/blob/9ab2c905e2e81999347742f880bfd851f9e32022/src/lib/sort/sort-header.ts#L230&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/angular/material2/blob/9ab2c905e2e81999347742f880bfd851f9e32022/src/lib/sort/sort-header.ts#L145-L159" rel="noopener noreferrer"&gt;https://github.com/angular/material2/blob/9ab2c905e2e81999347742f880bfd851f9e32022/src/lib/sort/sort-header.ts#L145-L159&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/angular/material2/blob/9ab2c905e2e81999347742f880bfd851f9e32022/src/lib/sort/sort-header.ts#L204-L212" rel="noopener noreferrer"&gt;https://github.com/angular/material2/blob/9ab2c905e2e81999347742f880bfd851f9e32022/src/lib/sort/sort-header.ts#L204-L212&lt;/a&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/angular/components/issues/10242#issuecomment-421490991" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Let's apply that hack.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;initialSetup&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// HACK 1&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForQueryParamsToLoad&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;activeSortQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;sortable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MatSortable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort_active&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort_direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;disableClear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sortable&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// HACK 2&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;activeSortHeader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sortables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;activeSortQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort_active&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;activeSortHeader&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_setAnimationTransitionState&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]({&lt;/span&gt;
      &lt;span class="na"&gt;fromState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;toState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;At last, we are done with the sorting.&lt;/p&gt;

&lt;p&gt;Pagination is similar to the sorting we just implemented. One thing that is different from sorting is that we don't need any special hack for pagination. If you followed along with the guide and understood every piece of it, it will be bread and butter for you to implement pagination. Also, think about some scenarios like an advanced filter for the table. You can manage advance filters from query params with angular reactive forms using a similar idea.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you couldn't build the pagination by yourself, the resources below may help you: &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Find the everything we coded here on &lt;a href="[https://github.com/abdunnahid/nghacks/tree/master/articles/mat-table-query-params](https://github.com/abdunnahid/nghacks/tree/master/articles/mat-table-query-params)"&gt;GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The directive is also built as an Angular Library: &lt;a href="[https://github.com/abdunnahid/nghacks/tree/master/main/projects/ngmat-table-query-reflector](https://github.com/abdunnahid/nghacks/tree/master/main/projects/ngmat-table-query-reflector)"&gt;Here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The library is also available on NPM: &lt;a href="[https://www.npmjs.com/package/@nghacks/ngmat-table-query-reflector](https://www.npmjs.com/package/@nghacks/ngmat-table-query-reflector)"&gt;@nghacks/ngmat-table-query-reflector&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;This is a part of GitHub &lt;a href="https://github.com/abdunnahid/nghacks" rel="noopener noreferrer"&gt;repo&lt;/a&gt;:
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/abdunnahid" rel="noopener noreferrer"&gt;
        abdunnahid
      &lt;/a&gt; / &lt;a href="https://github.com/abdunnahid/nghacks" rel="noopener noreferrer"&gt;
        nghacks
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Custom UI components built with Angular &amp;amp; Angular Material
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NgHacks&lt;/h1&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Custom UI components built with Angular &amp;amp; Angular Material&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3d3cefd85d26051b09bda566adf890d5fe35d1fed3aef6e74cecea1ff3043f0e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f616264756e6e616869642f6e676861636b73"&gt;&lt;img src="https://camo.githubusercontent.com/3d3cefd85d26051b09bda566adf890d5fe35d1fed3aef6e74cecea1ff3043f0e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f616264756e6e616869642f6e676861636b73" alt="GitHub commit activity"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bc5e6da8bb9fedb45ffe87aa413763a3d87ea731d49ba7e728cf281c01c33e6f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f43492532302d2532304d61696e2532304170703f6c6162656c3d776562253230707265766965772532306275696c64"&gt;&lt;img src="https://camo.githubusercontent.com/bc5e6da8bb9fedb45ffe87aa413763a3d87ea731d49ba7e728cf281c01c33e6f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f43492532302d2532304d61696e2532304170703f6c6162656c3d776562253230707265766965772532306275696c64" alt="GitHub Workflow Status"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c18cd32802cfeece6ab87bed9b761bc312bfc1d2414da3ccd8010c5590bf9f7a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f616264756e6e616869642f6e676861636b73"&gt;&lt;img src="https://camo.githubusercontent.com/c18cd32802cfeece6ab87bed9b761bc312bfc1d2414da3ccd8010c5590bf9f7a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f616264756e6e616869642f6e676861636b73" alt="GitHub"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Live Preview&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Browse: &lt;a href="https://ng-hack.web.app/" rel="nofollow noopener noreferrer"&gt;ng-hack.web.app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3877a6ab5ef467903b9e40a3f1ebcc427f8635b0066b9daf43b657886cb356d4/68747470733a2f2f696d672e736869656c64732e696f2f776562736974653f75726c3d68747470732533412532462532466e672d6861636b2e7765622e617070253246" alt="Website"&gt;&lt;/a&gt;
&lt;a href="https://ng-hack.web.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/04874513d5df830e7fcadad8341269ff7865184953fd6a8b2504144416bd7685/68747470733a2f2f696d672e736869656c64732e696f2f7733632d76616c69646174696f6e2f68746d6c3f7072657365743d48544d4c253243253230535647253230312e312532432532304d6174684d4c253230332e302674617267657455726c3d68747470732533412532462532466e672d6861636b2e7765622e617070253246" alt="W3C Validation"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Components&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/ngmat-table-query-reflector" rel="noopener noreferrer"&gt;ngmat-table-query-reflector&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Stores and retrieves mat table states (sorting, pagination) with url query params.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/mat-table-query-reflector" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can read that on my &lt;a href="https://dev.to/abdunnahid/managing-angular-material-table-states-with-query-params-a-comprehensive-guide-1o8j" rel="nofollow"&gt;blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/ngmat-table-query-reflector" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1fa0c5082c900440406e7f38ba6b460e1e49775f182170a9ada9e311b97f2b75/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f6e676d61742d7461626c652d71756572792d7265666c6563746f723f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/ngmat-table-query-reflector" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9497df034b4f6238b48ca357c2dccd69cd11f38fa59795baf7853676b4e37f1b/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f6e676d61742d7461626c652d71756572792d7265666c6563746f72" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f47fe96aefbf07824ea004be2b694fdfe12899cfd5a2c7606176590be0c1d9a7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276e676d61742d7461626c652d71756572792d7265666c6563746f72273f6c6162656c3d6275696c642532302532376e676d61742d7461626c652d71756572792d7265666c6563746f72253237"&gt;&lt;img src="https://camo.githubusercontent.com/f47fe96aefbf07824ea004be2b694fdfe12899cfd5a2c7606176590be0c1d9a7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276e676d61742d7461626c652d71756572792d7265666c6563746f72273f6c6162656c3d6275696c642532302532376e676d61742d7461626c652d71756572792d7265666c6563746f72253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/dynamic-browser-title" rel="noopener noreferrer"&gt;dynamic-browser-title&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Updates browser title dynamically &amp;amp; automatically on route change.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/dynamic-browser-title" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/dynamic-browser-title" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/29e9e495fe7d6fa095b819b5c54ef2b15cd8cdc12926a821d4794b8850a5b07e/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f64796e616d69632d62726f777365722d7469746c653f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/dynamic-browser-title" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9bb4b7d9da71fa694b3b9466592aae53cdf3cf129b2f25e54b7f668d0b4915c5/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f64796e616d69632d62726f777365722d7469746c65" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bf696e3e712058884a75d3ab0d50d18913e4e3becb3ee0648a7a7a0ee870e9a3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302764796e616d69632d62726f777365722d7469746c65273f6c6162656c3d6275696c6425323025323764796e616d69632d62726f777365722d7469746c65253237"&gt;&lt;img src="https://camo.githubusercontent.com/bf696e3e712058884a75d3ab0d50d18913e4e3becb3ee0648a7a7a0ee870e9a3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302764796e616d69632d62726f777365722d7469746c65273f6c6162656c3d6275696c6425323025323764796e616d69632d62726f777365722d7469746c65253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/uploader" rel="noopener noreferrer"&gt;uploader&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Picks image or file&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/uploader" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/uploader" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7358ef23c07d294d337e590c96ad1dd25242645a2982d6de9c66deca1d0737d5/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f75706c6f616465723f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/uploader" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4269714ba714da9003028b0e28126ca420103e7f1aab74d80d3745a2bfd1bcf8/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f75706c6f61646572" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7c80ab52f881b7739d62919f967ec65e44f817af01fe5a3a78978956df96b583/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302775706c6f61646572273f6c6162656c3d6275696c6425323025323775706c6f61646572253237"&gt;&lt;img src="https://camo.githubusercontent.com/7c80ab52f881b7739d62919f967ec65e44f817af01fe5a3a78978956df96b583/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302775706c6f61646572273f6c6162656c3d6275696c6425323025323775706c6f61646572253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/info-dialog" rel="noopener noreferrer"&gt;info-dialog&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Shows detail information on a dialog/modal&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/info-dialog" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/info-dialog" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d7f1d79afcf0637c21a2d22ade74fc38422e48f348b527d68730967c4cde2b2d/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f696e666f2d6469616c6f673f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/info-dialog" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/eaa93a98261cdb6b7006d541a890dab0ded2ad9b77186dd59fea6cd059ece942/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f696e666f2d6469616c6f67" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/54482609f0292e20cd73df573436dde770c6a1928b52d3b1123b397d382e7047/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696e666f2d6469616c6f67273f6c6162656c3d6275696c64253230253237696e666f2d6469616c6f67253237"&gt;&lt;img src="https://camo.githubusercontent.com/54482609f0292e20cd73df573436dde770c6a1928b52d3b1123b397d382e7047/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696e666f2d6469616c6f67273f6c6162656c3d6275696c64253230253237696e666f2d6469616c6f67253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/image-viewer" rel="noopener noreferrer"&gt;image-viewer&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Shows full size image in a overlay maintaining the aspect ratio.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/image-viewer" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/image-viewer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a6096f6c3909a1587b87868bdf87166c7a81091f8b2dba1032a3ce2eedffb1fd/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f696d6167652d7669657765723f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/image-viewer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b58379c03dc43c40cfc783da101e8eee6225b7b007421a542866525a077f51f0/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f696d6167652d766965776572" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/377036c9dacf6bec5db734938721d7ebd767c5b826bfcce4dacde601035e4cb8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696d6167652d766965776572273f6c6162656c3d6275696c64253230253237696d6167652d766965776572253237"&gt;&lt;img src="https://camo.githubusercontent.com/377036c9dacf6bec5db734938721d7ebd767c5b826bfcce4dacde601035e4cb8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696d6167652d766965776572273f6c6162656c3d6275696c64253230253237696d6167652d766965776572253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/quantity-input" rel="noopener noreferrer"&gt;quantity-input&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Quantity input for shopping cart.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/quantity-input" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/quantity-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f8d7400d034cc8e3aa50ed6d4c30ee015f4839d4e9bedd6a49e135efaa7dc1a0/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f7175616e746974792d696e7075743f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/quantity-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/352b1d09954d6a867b20a96f26f55b25d3e59c82f77a7ae77d1a495647c69b05/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f7175616e746974792d696e707574" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4802b804bbfeb4109010d10fe8b843890c5bcaadfcaf1e4358ec7d586f699f2a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230277175616e746974792d696e707574273f6c6162656c3d6275696c642532302532377175616e746974792d696e707574253237"&gt;&lt;img src="https://camo.githubusercontent.com/4802b804bbfeb4109010d10fe8b843890c5bcaadfcaf1e4358ec7d586f699f2a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230277175616e746974792d696e707574273f6c6162656c3d6275696c642532302532377175616e746974792d696e707574253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/rating-input" rel="noopener noreferrer"&gt;rating-input&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Rating input for products/services.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/rating-input" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/rating-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bca2b83199a54925a1a40066401ef59caf93f9ce76f661d19a7be38489c0dace/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f726174696e672d696e7075743f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/rating-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/307adf3eff390116c7cb24fee507b0ac48eaace43386a34d5e673a2de2b5a7a1/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f726174696e672d696e707574" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/27e2dd1cea7e95c97c6e2b207caead50fbe67673c5930af0944f94391c061682/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027726174696e672d696e707574273f6c6162656c3d6275696c64253230253237726174696e672d696e707574253237"&gt;&lt;img src="https://camo.githubusercontent.com/27e2dd1cea7e95c97c6e2b207caead50fbe67673c5930af0944f94391c061682/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027726174696e672d696e707574273f6c6162656c3d6275696c64253230253237726174696e672d696e707574253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/banner-carousel" rel="noopener noreferrer"&gt;banner-carousel&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Image carousel for web page banner.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/banner-carousel" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/banner-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cc427dede27a647f4d49b5873b14c39314d743496ec26eee2b1e76d092fd0c3b/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f62616e6e65722d6361726f7573656c3f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/banner-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7b5bdbddd501dd3db21e141b4a784b391db30a960749847f8e21789ba8029685/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f62616e6e65722d6361726f7573656c" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4e43f57353b6d46db744dc32ef16798f5ec58c8fd20e43d47d4b82ed71962ac5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302762616e6e65722d6361726f7573656c273f6c6162656c3d6275696c6425323025323762616e6e65722d6361726f7573656c253237"&gt;&lt;img src="https://camo.githubusercontent.com/4e43f57353b6d46db744dc32ef16798f5ec58c8fd20e43d47d4b82ed71962ac5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302762616e6e65722d6361726f7573656c273f6c6162656c3d6275696c6425323025323762616e6e65722d6361726f7573656c253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/overflow-carousel" rel="noopener noreferrer"&gt;overflow-carousel&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Show overflowing content as carousel.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/overflow-carousel" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/overflow-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/299938cd8862f1a00605f9f3b957adf0f2f86c263f439f9a2f8a2a814d6a07d5/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f6f766572666c6f772d6361726f7573656c3f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/overflow-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3f575ea499ce7af1540573d583c179a98acbc33e15db37a32b11363f8d8534d1/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f6f766572666c6f772d6361726f7573656c" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/469ec8aa004d0645194848c5f5713ceb0d608a5b05646face8516848290b6463/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276f766572666c6f772d6361726f7573656c273f6c6162656c3d6275696c642532302532376f766572666c6f772d6361726f7573656c253237"&gt;&lt;img src="https://camo.githubusercontent.com/469ec8aa004d0645194848c5f5713ceb0d608a5b05646face8516848290b6463/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276f766572666c6f772d6361726f7573656c273f6c6162656c3d6275696c642532302532376f766572666c6f772d6361726f7573656c253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/abdunnahid/nghacks" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;

&lt;/li&gt;

&lt;li&gt;Live on &lt;a href="[https://ng-hack.web.app/mat-table-query-reflector](https://ng-hack.web.app/mat-table-query-reflector)"&gt;web&lt;/a&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;That's it for now. Let me know what you think about the hacks I used. If you know any better solution you must let me know. You can also contribute to the &lt;a href="https://github.com/abdunnahid/nghacks" rel="noopener noreferrer"&gt;repo&lt;/a&gt; with your improvements or content. &lt;/p&gt;

&lt;p&gt;For any queries, please comment or DM on &lt;a href="[https://twitter.com/abdunnahid](https://twitter.com/abdunnahid)"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>tutorial</category>
      <category>nghacks</category>
    </item>
    <item>
      <title>Ng Hacks: Series Introduction</title>
      <dc:creator>Abdun Nahid</dc:creator>
      <pubDate>Fri, 14 Aug 2020 11:03:40 +0000</pubDate>
      <link>https://dev.to/abdunnahid/ng-hacks-series-introduction-k4h</link>
      <guid>https://dev.to/abdunnahid/ng-hacks-series-introduction-k4h</guid>
      <description>&lt;p&gt;Hi&lt;br&gt;
This is my first ever technical writing. I used to read your posts silently. I read a lot of benefits of writing but couldn’t write something by myself. I’d got mixed feelings. This time I determined that I must write and I will write. And here it is. I wish to have your Indulgence.🤗&lt;/p&gt;

&lt;p&gt;We developers always stuck into problems. We spend hours on finding solutions. Sometimes it seems impossible. But somehow we come up with a solution, does not need to be the perfect one. Everyone knows the term “hack” or “workaround”. Almost every developer does the practical implementation of this term. It can be because of the deadline, tight task estimation, lack of knowledge, or maybe the bug in the technology itself. I also did some hacky implementation with Angular. This series is about those hacks.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; This series of articles shows hacks &amp;amp; workaround solutions. And also may contain bad practices. Please take it with that concern on your mind. Your opinion can be different on things and that's fine. Let me know your thoughts. These are the hacks that worked for me.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This series belongs to this &lt;a href="https://github.com/abdunnahid/nghacks" rel="noopener noreferrer"&gt;repo&lt;/a&gt;:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/abdunnahid" rel="noopener noreferrer"&gt;
        abdunnahid
      &lt;/a&gt; / &lt;a href="https://github.com/abdunnahid/nghacks" rel="noopener noreferrer"&gt;
        nghacks
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Custom UI components built with Angular &amp;amp; Angular Material
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NgHacks&lt;/h1&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Custom UI components built with Angular &amp;amp; Angular Material&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3d3cefd85d26051b09bda566adf890d5fe35d1fed3aef6e74cecea1ff3043f0e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f616264756e6e616869642f6e676861636b73"&gt;&lt;img src="https://camo.githubusercontent.com/3d3cefd85d26051b09bda566adf890d5fe35d1fed3aef6e74cecea1ff3043f0e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f616264756e6e616869642f6e676861636b73" alt="GitHub commit activity"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bc5e6da8bb9fedb45ffe87aa413763a3d87ea731d49ba7e728cf281c01c33e6f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f43492532302d2532304d61696e2532304170703f6c6162656c3d776562253230707265766965772532306275696c64"&gt;&lt;img src="https://camo.githubusercontent.com/bc5e6da8bb9fedb45ffe87aa413763a3d87ea731d49ba7e728cf281c01c33e6f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f43492532302d2532304d61696e2532304170703f6c6162656c3d776562253230707265766965772532306275696c64" alt="GitHub Workflow Status"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c18cd32802cfeece6ab87bed9b761bc312bfc1d2414da3ccd8010c5590bf9f7a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f616264756e6e616869642f6e676861636b73"&gt;&lt;img src="https://camo.githubusercontent.com/c18cd32802cfeece6ab87bed9b761bc312bfc1d2414da3ccd8010c5590bf9f7a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f616264756e6e616869642f6e676861636b73" alt="GitHub"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Live Preview&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Browse: &lt;a href="https://ng-hack.web.app/" rel="nofollow noopener noreferrer"&gt;ng-hack.web.app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3877a6ab5ef467903b9e40a3f1ebcc427f8635b0066b9daf43b657886cb356d4/68747470733a2f2f696d672e736869656c64732e696f2f776562736974653f75726c3d68747470732533412532462532466e672d6861636b2e7765622e617070253246" alt="Website"&gt;&lt;/a&gt;
&lt;a href="https://ng-hack.web.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/04874513d5df830e7fcadad8341269ff7865184953fd6a8b2504144416bd7685/68747470733a2f2f696d672e736869656c64732e696f2f7733632d76616c69646174696f6e2f68746d6c3f7072657365743d48544d4c253243253230535647253230312e312532432532304d6174684d4c253230332e302674617267657455726c3d68747470732533412532462532466e672d6861636b2e7765622e617070253246" alt="W3C Validation"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Components&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/ngmat-table-query-reflector" rel="noopener noreferrer"&gt;ngmat-table-query-reflector&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Stores and retrieves mat table states (sorting, pagination) with url query params.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/mat-table-query-reflector" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can read that on my &lt;a href="https://dev.to/abdunnahid/managing-angular-material-table-states-with-query-params-a-comprehensive-guide-1o8j" rel="nofollow"&gt;blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/ngmat-table-query-reflector" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1fa0c5082c900440406e7f38ba6b460e1e49775f182170a9ada9e311b97f2b75/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f6e676d61742d7461626c652d71756572792d7265666c6563746f723f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/ngmat-table-query-reflector" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9497df034b4f6238b48ca357c2dccd69cd11f38fa59795baf7853676b4e37f1b/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f6e676d61742d7461626c652d71756572792d7265666c6563746f72" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f47fe96aefbf07824ea004be2b694fdfe12899cfd5a2c7606176590be0c1d9a7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276e676d61742d7461626c652d71756572792d7265666c6563746f72273f6c6162656c3d6275696c642532302532376e676d61742d7461626c652d71756572792d7265666c6563746f72253237"&gt;&lt;img src="https://camo.githubusercontent.com/f47fe96aefbf07824ea004be2b694fdfe12899cfd5a2c7606176590be0c1d9a7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276e676d61742d7461626c652d71756572792d7265666c6563746f72273f6c6162656c3d6275696c642532302532376e676d61742d7461626c652d71756572792d7265666c6563746f72253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/dynamic-browser-title" rel="noopener noreferrer"&gt;dynamic-browser-title&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Updates browser title dynamically &amp;amp; automatically on route change.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/dynamic-browser-title" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/dynamic-browser-title" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/29e9e495fe7d6fa095b819b5c54ef2b15cd8cdc12926a821d4794b8850a5b07e/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f64796e616d69632d62726f777365722d7469746c653f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/dynamic-browser-title" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9bb4b7d9da71fa694b3b9466592aae53cdf3cf129b2f25e54b7f668d0b4915c5/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f64796e616d69632d62726f777365722d7469746c65" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bf696e3e712058884a75d3ab0d50d18913e4e3becb3ee0648a7a7a0ee870e9a3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302764796e616d69632d62726f777365722d7469746c65273f6c6162656c3d6275696c6425323025323764796e616d69632d62726f777365722d7469746c65253237"&gt;&lt;img src="https://camo.githubusercontent.com/bf696e3e712058884a75d3ab0d50d18913e4e3becb3ee0648a7a7a0ee870e9a3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302764796e616d69632d62726f777365722d7469746c65273f6c6162656c3d6275696c6425323025323764796e616d69632d62726f777365722d7469746c65253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/uploader" rel="noopener noreferrer"&gt;uploader&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Picks image or file&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/uploader" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/uploader" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7358ef23c07d294d337e590c96ad1dd25242645a2982d6de9c66deca1d0737d5/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f75706c6f616465723f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/uploader" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4269714ba714da9003028b0e28126ca420103e7f1aab74d80d3745a2bfd1bcf8/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f75706c6f61646572" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7c80ab52f881b7739d62919f967ec65e44f817af01fe5a3a78978956df96b583/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302775706c6f61646572273f6c6162656c3d6275696c6425323025323775706c6f61646572253237"&gt;&lt;img src="https://camo.githubusercontent.com/7c80ab52f881b7739d62919f967ec65e44f817af01fe5a3a78978956df96b583/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302775706c6f61646572273f6c6162656c3d6275696c6425323025323775706c6f61646572253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/info-dialog" rel="noopener noreferrer"&gt;info-dialog&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Shows detail information on a dialog/modal&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/info-dialog" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/info-dialog" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d7f1d79afcf0637c21a2d22ade74fc38422e48f348b527d68730967c4cde2b2d/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f696e666f2d6469616c6f673f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/info-dialog" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/eaa93a98261cdb6b7006d541a890dab0ded2ad9b77186dd59fea6cd059ece942/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f696e666f2d6469616c6f67" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/54482609f0292e20cd73df573436dde770c6a1928b52d3b1123b397d382e7047/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696e666f2d6469616c6f67273f6c6162656c3d6275696c64253230253237696e666f2d6469616c6f67253237"&gt;&lt;img src="https://camo.githubusercontent.com/54482609f0292e20cd73df573436dde770c6a1928b52d3b1123b397d382e7047/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696e666f2d6469616c6f67273f6c6162656c3d6275696c64253230253237696e666f2d6469616c6f67253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/image-viewer" rel="noopener noreferrer"&gt;image-viewer&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Shows full size image in a overlay maintaining the aspect ratio.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/image-viewer" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/image-viewer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a6096f6c3909a1587b87868bdf87166c7a81091f8b2dba1032a3ce2eedffb1fd/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f696d6167652d7669657765723f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/image-viewer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b58379c03dc43c40cfc783da101e8eee6225b7b007421a542866525a077f51f0/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f696d6167652d766965776572" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/377036c9dacf6bec5db734938721d7ebd767c5b826bfcce4dacde601035e4cb8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696d6167652d766965776572273f6c6162656c3d6275696c64253230253237696d6167652d766965776572253237"&gt;&lt;img src="https://camo.githubusercontent.com/377036c9dacf6bec5db734938721d7ebd767c5b826bfcce4dacde601035e4cb8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027696d6167652d766965776572273f6c6162656c3d6275696c64253230253237696d6167652d766965776572253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/quantity-input" rel="noopener noreferrer"&gt;quantity-input&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Quantity input for shopping cart.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/quantity-input" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/quantity-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f8d7400d034cc8e3aa50ed6d4c30ee015f4839d4e9bedd6a49e135efaa7dc1a0/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f7175616e746974792d696e7075743f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/quantity-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/352b1d09954d6a867b20a96f26f55b25d3e59c82f77a7ae77d1a495647c69b05/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f7175616e746974792d696e707574" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4802b804bbfeb4109010d10fe8b843890c5bcaadfcaf1e4358ec7d586f699f2a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230277175616e746974792d696e707574273f6c6162656c3d6275696c642532302532377175616e746974792d696e707574253237"&gt;&lt;img src="https://camo.githubusercontent.com/4802b804bbfeb4109010d10fe8b843890c5bcaadfcaf1e4358ec7d586f699f2a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230277175616e746974792d696e707574273f6c6162656c3d6275696c642532302532377175616e746974792d696e707574253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/rating-input" rel="noopener noreferrer"&gt;rating-input&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Rating input for products/services.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/rating-input" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/rating-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bca2b83199a54925a1a40066401ef59caf93f9ce76f661d19a7be38489c0dace/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f726174696e672d696e7075743f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/rating-input" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/307adf3eff390116c7cb24fee507b0ac48eaace43386a34d5e673a2de2b5a7a1/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f726174696e672d696e707574" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/27e2dd1cea7e95c97c6e2b207caead50fbe67673c5930af0944f94391c061682/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027726174696e672d696e707574273f6c6162656c3d6275696c64253230253237726174696e672d696e707574253237"&gt;&lt;img src="https://camo.githubusercontent.com/27e2dd1cea7e95c97c6e2b207caead50fbe67673c5930af0944f94391c061682/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c69736825323027726174696e672d696e707574273f6c6162656c3d6275696c64253230253237726174696e672d696e707574253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/banner-carousel" rel="noopener noreferrer"&gt;banner-carousel&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Image carousel for web page banner.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/banner-carousel" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/banner-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cc427dede27a647f4d49b5873b14c39314d743496ec26eee2b1e76d092fd0c3b/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f62616e6e65722d6361726f7573656c3f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/banner-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7b5bdbddd501dd3db21e141b4a784b391db30a960749847f8e21789ba8029685/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f62616e6e65722d6361726f7573656c" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4e43f57353b6d46db744dc32ef16798f5ec58c8fd20e43d47d4b82ed71962ac5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302762616e6e65722d6361726f7573656c273f6c6162656c3d6275696c6425323025323762616e6e65722d6361726f7573656c253237"&gt;&lt;img src="https://camo.githubusercontent.com/4e43f57353b6d46db744dc32ef16798f5ec58c8fd20e43d47d4b82ed71962ac5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c6973682532302762616e6e65722d6361726f7573656c273f6c6162656c3d6275696c6425323025323762616e6e65722d6361726f7573656c253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/abdunnahid/nghacks/tree/master/main/projects/overflow-carousel" rel="noopener noreferrer"&gt;overflow-carousel&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Show overflowing content as carousel.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ng-hack.web.app/overflow-carousel" rel="nofollow noopener noreferrer"&gt;Live Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@nghacks/overflow-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/299938cd8862f1a00605f9f3b957adf0f2f86c263f439f9a2f8a2a814d6a07d5/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e676861636b732f6f766572666c6f772d6361726f7573656c3f636f6c6f723d253233633533363335" alt="npm (scoped)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@nghacks/overflow-carousel" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3f575ea499ce7af1540573d583c179a98acbc33e15db37a32b11363f8d8534d1/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f406e676861636b732f6f766572666c6f772d6361726f7573656c" alt="npm"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/469ec8aa004d0645194848c5f5713ceb0d608a5b05646face8516848290b6463/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276f766572666c6f772d6361726f7573656c273f6c6162656c3d6275696c642532302532376f766572666c6f772d6361726f7573656c253237"&gt;&lt;img src="https://camo.githubusercontent.com/469ec8aa004d0645194848c5f5713ceb0d608a5b05646face8516848290b6463/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f616264756e6e616869642f6e676861636b732f6e706d2d7075626c697368253230276f766572666c6f772d6361726f7573656c273f6c6162656c3d6275696c642532302532376f766572666c6f772d6361726f7573656c253237" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/abdunnahid/nghacks" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Let the hacking begin.&lt;br&gt;
Wish me luck. 😇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>tutorial</category>
      <category>nghacks</category>
    </item>
  </channel>
</rss>
