<?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>Forem: Josh Sommer</title>
    <description>The latest articles on Forem by Josh Sommer (@_joshsommer).</description>
    <link>https://forem.com/_joshsommer</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%2F17799%2Fa86dbfb4-c035-43c3-b101-d3b91d421386.jpg</url>
      <title>Forem: Josh Sommer</title>
      <link>https://forem.com/_joshsommer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/_joshsommer"/>
    <language>en</language>
    <item>
      <title>NativeScript ListView Skeleton Screens with Angular &amp; RxJS ☠️</title>
      <dc:creator>Josh Sommer</dc:creator>
      <pubDate>Sun, 21 Oct 2018 18:11:38 +0000</pubDate>
      <link>https://forem.com/_joshsommer/nativescript-listview-skeletons-in-angular--rxjs--1m3d</link>
      <guid>https://forem.com/_joshsommer/nativescript-listview-skeletons-in-angular--rxjs--1m3d</guid>
      <description>&lt;p&gt;It's just about Halloween so now seems to be the perfect time to discuss a technique I've started using more lately: skeleton screens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skeleton Screens
&lt;/h3&gt;

&lt;p&gt;If you've used just about any major website in the last couple of years you've probably seen skeleton screen. I particularly like them because they give you an idea of what to expect before the data loads. With a mobile device, they make extra sense to me since at times the user's data connection could be particularly slow. &lt;/p&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ft82y10c5vl7w5l2vk16j.jpg" 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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ft82y10c5vl7w5l2vk16j.jpg" alt="Skeletons being used on Slack" id="fig_id" width="800" height="450"&gt;&lt;/a&gt;Skeletons being used on Slack.&lt;/p&gt;

&lt;h3&gt;
  
  
  NativeScript
&lt;/h3&gt;

&lt;p&gt;If you aren't familiar with NativeScript, you should really check it out. NativeScript is my favorite mobile development framework, between having 100% access to Native API's, Angular support, and their online playground where you can write code in your browser and test it on your phone. These features and more make it's the hands down the best way to develop multi-platform apps. &lt;/p&gt;

&lt;h3&gt;
  
  
  ListView Skeletons in NativeScript
&lt;/h3&gt;

&lt;p&gt;Normally we could approach this with a &lt;code&gt;ngIf&lt;/code&gt; and a &lt;code&gt;else&lt;/code&gt;, something like:&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;StackLayout&lt;/span&gt; &lt;span class="na"&gt;*ngIf=&lt;/span&gt;&lt;span class="s"&gt;"data$ | async; else skeletons"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!---View of data after Loaded --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/StackLayout&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class="na"&gt;#skeletons&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!--- Skeletons Here --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way before our observable with my response object emits a value it will display a different template. This pattern works pretty well for both NativeScript and the Web (replace &lt;code&gt;StackLayout&lt;/code&gt; with &lt;code&gt;div&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;However, for this use case, we have a long list of items that we are displaying so it is best to use a ListView for performance reasons. Because we want our skeletons to mimic the UI as much as possible we will want them in a ListView as well. &lt;/p&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhr8882a826pfgu3zbtvo.png" 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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhr8882a826pfgu3zbtvo.png" alt="Screenshot of my ListView" id="fig_id" width="400" height="711"&gt;&lt;/a&gt;&lt;/p&gt;
Screenshot of my ListView 



&lt;p&gt;If we wanted we could use the same pattern as above and have two separate ListViews on my page. One for the content, one for my skeletons. This is not a very efficient use of our layout and will make it harder to make changes to the UI since it will be decoupling the skeletons from the end result.&lt;/p&gt;

&lt;h3&gt;
  
  
  ListView Template Selectors
&lt;/h3&gt;

&lt;p&gt;NativeScript's ListView has an easy way to alternate between templates. By defining a &lt;code&gt;itemTemplateSelector&lt;/code&gt; callback function and giving each template a key with the &lt;code&gt;nsTemplateKey&lt;/code&gt; attribute, we are able to swap layouts. Every time a ListView loads an item to display to the user, the template selector function fires and determines which template to use for that item. The last thing we need to do is then pass our template selector callback to our ListView via the input.&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;ListView&lt;/span&gt; &lt;span class="na"&gt;[items]=&lt;/span&gt;&lt;span class="s"&gt;"genres$ | async"&lt;/span&gt; &lt;span class="na"&gt;[itemTemplateSelector]=&lt;/span&gt;&lt;span class="s"&gt;"templateSelector"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class="na"&gt;nsTemplateKey=&lt;/span&gt;&lt;span class="s"&gt;"template"&lt;/span&gt; &lt;span class="na"&gt;let-item=&lt;/span&gt;&lt;span class="s"&gt;"item"&lt;/span&gt; &lt;span class="na"&gt;let-index=&lt;/span&gt;&lt;span class="s"&gt;"index"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;GridLayout&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"music-genre"&lt;/span&gt; &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt; &lt;span class="na"&gt;columns=&lt;/span&gt;&lt;span class="s"&gt;"55,*"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;row=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;col=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;[text]=&lt;/span&gt;&lt;span class="s"&gt;"index + 1"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"number"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/Label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;row=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;col=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;[text]=&lt;/span&gt;&lt;span class="s"&gt;"item"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"genre"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/Label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/GridLayout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class="na"&gt;nsTemplateKey=&lt;/span&gt;&lt;span class="s"&gt;"skeleton"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;GridLayout&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"music-genre skeleton"&lt;/span&gt; &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt; &lt;span class="na"&gt;columns=&lt;/span&gt;&lt;span class="s"&gt;"55,*"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;row=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;col=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;text=&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"number number-skeleton"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/Label&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;row=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;col=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;text=&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"genre genre-skeleton"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/Label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/GridLayout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ListView&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Our NativeScript Angular Template with a ListView to switch between a skeleton and normal template&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;itemTemplateSelector&lt;/code&gt; callback function has 3 parameters, the current item, that items index, and all the items currently in the list.&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;templateSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&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="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;template&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;p&gt;&lt;em&gt;Template selector function that always returns the type of &lt;code&gt;template&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  RxJS startWith Operator
&lt;/h3&gt;

&lt;p&gt;With the above template selector, we sill only see the genre items. We will need a way to load an array of "skeletons" first, then when we get our response back from the server replace the skeleton array with the results data array. This is where RxJS's &lt;code&gt;startWith&lt;/code&gt; operator comes into play. What we need to do is pass an array of objects to the pipeable operator &lt;code&gt;startsWith&lt;/code&gt;. We then "pipe" this operator when we set the &lt;code&gt;genres$&lt;/code&gt; observable property in the components &lt;code&gt;ngOnInit&lt;/code&gt; function. Now when we subscribe to the  &lt;code&gt;genres$&lt;/code&gt; observable it will emit two values. First the array of skeletons, then the results of our HTTP request, when it completes.&lt;/p&gt;

&lt;p&gt;What I like to do is declare a &lt;code&gt;ISkeleton&lt;/code&gt; interface which is an object that has a boolean property on it called &lt;code&gt;skeleton&lt;/code&gt;. Then create an array of objects each with there own &lt;code&gt;skeleton&lt;/code&gt; property set to true. This is then the array that is passed to the &lt;code&gt;startsWith&lt;/code&gt; operator to be emitted first by the &lt;code&gt;genres$&lt;/code&gt; observable.&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ISkeleton&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;skeleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;SKELETONS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ISkeleton&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;skeleton&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;skeleton&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="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// since this is for a listView I have quite a few of these. &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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeComponent&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="nx"&gt;genres$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ISkeleton&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&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;&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;genreService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GenreService&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="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Get a list of genre's from the genre service. but first, start by  &lt;/span&gt;
        &lt;span class="c1"&gt;// emmiting the SKELETONS array.&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;genres$&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;genreService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getGenres&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;startWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SKELETONS&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 is just about hooked up. However, if we run our app we are still not seeing our skeleton templates. The last step is to update our template selector function. All we need to do is check if the &lt;code&gt;item&lt;/code&gt; object that is passed to it has a skeletons property on it. If that returns truthy, then have our template selector function return the key of 'skeleton'.&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;templateSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&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="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;skeleton&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;skeleton&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;template&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;h3&gt;
  
  
  Finished Product
&lt;/h3&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F79291ev5eya6zt8o8egj.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F79291ev5eya6zt8o8egj.gif" alt="All tied together" id="fig_id" width="281" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see in the above gif when a user first comes to this view they are greeted with a list of skeletons immediately. Then once the HTTP request completes the view switches to a list of musical genres. We have been primed so to speak for this layout with the skeletons.&lt;/p&gt;

&lt;p&gt;Setting up our skeleton screens this way is only the beginning, there is so much more you could do with this pattern especially when it comes to animations. Because of the power of NativeScript's ListView, Angular and RxJS we have a very succinct code base to build upon.  &lt;/p&gt;

&lt;p&gt;You can view a working sample on the &lt;a href="https://play.nativescript.org/?template=play-ng&amp;amp;id=1xU1Fw&amp;amp;v=18" rel="noopener noreferrer"&gt;NativeScript Playground here&lt;/a&gt;. &lt;em&gt;Just a disclaimer it's currently styled to look good on iOS since I don't have an Android phone to test on currently.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading, I hope you enjoyed my take on this pattern. If you did, please share with your friends and co-workers. I'd really enjoy any feedback you have via the comments below. Or if you have your own take on skeleton screens in NativeScript let's see those too!&lt;/p&gt;

</description>
      <category>nativescript</category>
      <category>angular</category>
      <category>rxjs</category>
      <category>ux</category>
    </item>
  </channel>
</rss>
