<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Justin Schwartzenberger on Medium]]></title>
        <description><![CDATA[Stories by Justin Schwartzenberger on Medium]]></description>
        <link>https://medium.com/@schwarty?source=rss-a9286c256648------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*By3C_b85VnJfeNC1OV-mmA.jpeg</url>
            <title>Stories by Justin Schwartzenberger on Medium</title>
            <link>https://medium.com/@schwarty?source=rss-a9286c256648------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 23:49:50 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@schwarty/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Free Nx Workspaces Course Updated for Version 6]]></title>
            <link>https://medium.com/nrwl/free-nx-workspaces-course-updated-for-version-6-3bd671ab4502?source=rss-a9286c256648------2</link>
            <guid isPermaLink="false">https://medium.com/p/3bd671ab4502</guid>
            <category><![CDATA[nx]]></category>
            <category><![CDATA[angular-cli]]></category>
            <category><![CDATA[angular]]></category>
            <dc:creator><![CDATA[Justin Schwartzenberger]]></dc:creator>
            <pubDate>Fri, 31 Aug 2018 22:10:26 GMT</pubDate>
            <atom:updated>2019-08-13T15:46:54.600Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*V6tNTUOSSkq15YwL.png" /></figure><figure><a href="https://hubs.ly/H0g97HB0"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TigvMknUeSYC2BWKvnDCTw.jpeg" /></a></figure><p>We are excited to announce that our free <a href="https://angularplaybook.com/p/nx-workspaces">Nx Workspaces course</a> has been updated to cover Nx version 6 and above! The latest version of Nx aligns with the Angular CLI version 6, which brought about some changes to the workspace files, structure and command options. This course now includes all of that, providing a great way for you and your teams to get up and running with the current version of Nx.</p><blockquote>Nx is a set of extensible dev tools for monorepos that has first class support for Angular, React, and NodeJS applications.</blockquote><p>In this updated course you will learn how to create new Nx Workspaces with Nx 6 or upgrade an existing Angular CLI 6 workspace to an Nx Workspace. You will also learn how to add apps and libs to the workspace and how to serve and build apps within the workspace.</p><figure><a href="https://angularplaybook.com/p/nx-workspaces"><img alt="" src="https://cdn-images-1.medium.com/max/527/1*KEQwCJInWnVi3__nohjfYg.png" /></a><figcaption>Videos in Nx Workspaces Course</figcaption></figure><p><a href="https://angularplaybook.com/p/nx-workspaces"><strong>Learn More About This Free Course</strong></a></p><p>We also have a few blog posts that cover what’s new in Nx version 6.x:</p><ul><li><a href="https://blog.nrwl.io/announcing-nrwl-nx-6-0-29b963d87d8e">Announcing Nrwl Nx 6.0</a></li><li><a href="https://blog.nrwl.io/nrwl-nx-6-1-better-dev-ergonomics-faster-builds-3198bb310e39">Nrwl Nx 6.1: Better Dev Ergonomics, Faster Builds</a></li><li><a href="https://blog.nrwl.io/nrwl-nx-6-2-angular-6-1-and-better-state-management-e139da2cd074">Nrwl Nx 6.2: Angular 6.1 and Better State Management</a></li><li><a href="https://blog.nrwl.io/nrwl-nx-6-3-faster-testing-with-jest-20a8ddb5064">Nrwl Nx 6.3: Faster Testing with Jest</a></li></ul><p>If your company or team is experiencing challenges with architecting and engineering Angular applications at scale, the team at Nrwl can help! Visit <a href="https://nrwl.io/">https://nrwl.io</a> to learn more and to get in touch.</p><p>Nrwl has been started by ex-Googlers and Angular team members Victor Savkin and Jeff Cross. We are a distributed company with folks all over North America and offices in Toronto and New York. Some of our recent open source projects include <a href="http://angularconsole.com/">Angular Console</a> and <a href="http://github.com/nrwl/nx">Nx</a>.</p><p>Learn more about open positions at Nrwl <a href="https://jobs.lever.co/nrwl">here</a>.</p><figure><a href="https://hubs.ly/H0g97HB0"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TigvMknUeSYC2BWKvnDCTw.jpeg" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3bd671ab4502" width="1" height="1" alt=""><hr><p><a href="https://medium.com/nrwl/free-nx-workspaces-course-updated-for-version-6-3bd671ab4502">Free Nx Workspaces Course Updated for Version 6</a> was originally published in <a href="https://medium.com/nrwl">Nx Devtools</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Angular Enterprise Playbook Course — Angular v6: What is Coming and Updates Since v5]]></title>
            <link>https://medium.com/nrwl/angular-enterprise-playbook-course-angular-v6-what-is-coming-and-updates-since-v5-60542e8436bd?source=rss-a9286c256648------2</link>
            <guid isPermaLink="false">https://medium.com/p/60542e8436bd</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[angular-6]]></category>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[angular-enterprise]]></category>
            <category><![CDATA[angular-5]]></category>
            <dc:creator><![CDATA[Justin Schwartzenberger]]></dc:creator>
            <pubDate>Wed, 21 Feb 2018 17:14:07 GMT</pubDate>
            <atom:updated>2018-12-21T19:30:30.583Z</atom:updated>
            <content:encoded><![CDATA[<p>This blog is brought to you by Nrwl.io. <a href="https://hubs.ly/H0fSz780">→ Enter to win a ticket to ngAtlanta</a>, with Nrwl’s random ticket draw! 🍀😊</p><p>Last month we announced <a href="https://angularplaybook.com/">Angular Enterprise Playbook</a> and our first free course, <a href="https://angularplaybook.com/p/nx-workspaces">Nx Workspaces</a>. This month we have another free course that we are publishing that takes a look at what is coming in the Angular version 6.0.0 release and showcases some of the updates since the version 5.0.0 release.</p><blockquote><a href="https://angularplaybook.com/p/angular-v6-what-is-coming-and-updates-since-v5"><strong>Angular v6: What is Coming and Updates Since v5</strong></a></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*Y0j7fsVlS3c-1K15bMGHXQ.jpeg" /><figcaption>Enroll in this new course for free at AngularPlaybook.com</figcaption></figure><p>Angular Enterprise Playbook is one of the ways we help enterprise teams learn and adopt established best practices to build Angular apps at scale. To be successful in that arena, an important practice is to embrace the Angular semantic version release cycle. However, it’s not always easy (or efficient) for teams to be constantly monitoring the planned milestones and change-logs for Angular.</p><p>We are putting together a course that will deliver that information to you, ahead of the code release, that highlights the stuff teams will benefit from and might be impacted by. And we are making this course available while we are in the process of completing it so you will be able to receive the content as soon as it’s published.</p><p>This new free course, <a href="https://angularplaybook.com/p/angular-v6-what-is-coming-and-updates-since-v5"><strong>Angular v6: What is Coming and Updates Since v5</strong></a>, will cover a preview of what is upcoming as well as a detailed look at the minor releases that have come out since the release of version 5.0.0. It will also touch on the release strategy in more detail to get a better understanding of the versioning and what to expect with each release.</p><h3>Feedback Wanted</h3><p>We are always looking for feedback on the content we create. Each of the lectures has comments enabled, so please leave feedback there to let us know what we can do to make this a useful resource to you. Or if you have general feedback about Playbook, please submit a form with your suggestion here: <a href="https://goo.gl/forms/Tl3BSEwsW1lMbPe43">https://goo.gl/forms/Tl3BSEwsW1lMbPe43</a></p><h3>Coming Up</h3><p>We will continue to publish additional videos to this course as they are completed and get them to you ahead of the Angular version 6.0.0 release. And again, keeping teams informed is an important part of that puzzle that we aim to fill in as Angular moves forward, so expect similar courses as versions of the platform progress.</p><p>Visit <a href="https://angularplaybook.com/">angularplaybook.com</a> to get started.</p><p>This blog is brought to you by Nrwl.io. <a href="https://hubs.ly/H0fSz780">→ Enter to win a ticket to ngAtlanta</a>, with Nrwl’s random ticket draw! 🍀😊</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=60542e8436bd" width="1" height="1" alt=""><hr><p><a href="https://medium.com/nrwl/angular-enterprise-playbook-course-angular-v6-what-is-coming-and-updates-since-v5-60542e8436bd">Angular Enterprise Playbook Course — Angular v6: What is Coming and Updates Since v5</a> was originally published in <a href="https://medium.com/nrwl">Nx Devtools</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How Nx Helps to Encourage Teams to Modularize Code]]></title>
            <link>https://medium.com/nrwl/how-nx-helps-to-encourage-teams-to-modularize-code-d6d3899e8343?source=rss-a9286c256648------2</link>
            <guid isPermaLink="false">https://medium.com/p/d6d3899e8343</guid>
            <category><![CDATA[monorepo]]></category>
            <category><![CDATA[nx]]></category>
            <category><![CDATA[angular-cli]]></category>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[angularjs]]></category>
            <dc:creator><![CDATA[Justin Schwartzenberger]]></dc:creator>
            <pubDate>Mon, 20 Nov 2017 18:36:25 GMT</pubDate>
            <atom:updated>2017-11-20T18:36:25.475Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JoEobjOUyZPSYrafAmaFPQ.jpeg" /><figcaption>Assemble small modules into apps: photo by <a href="https://unsplash.com/photos/osSryggkso4?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Vadim Sherbakov</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p><em>Justin Schwartzenberger is a Product Manager and Educator on the Nrwl team. He is also the host of </em><a href="http://angularair.com/"><em>AngularAir</em></a><em>, a weekly videocast about all things Angular.</em></p><p><a href="https://nrwl.io/nx"><strong>Nx</strong></a> helps organize domain specific applications and libs into a mono repo powered by the Angular CLI. There are several benefits that this provides, one of which is the modularization of code. Let’s take a look at how that is accomplished with Nx and how it leads teams to form reliable patterns.</p><blockquote>Documentation on <strong>Nx</strong> can be found at <a href="https://nrwl.io/nx">nrwl.io/nx</a></blockquote><p>A workspace created by Nx comes structured with an apps and a libs directory. New Angular apps can be created by running the ng g app &lt;name&gt; command and new libs by the ng g lib &lt;name&gt; command.</p><p>Say we are ready to start building our first app, what we call the customer portal, and we start by creating a new Angular app in the workspace. And let’s say we know we are going to use routing so we leverage the routing flag when we do so.</p><pre>ng g app customer-portal --routing</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*NboMFUu2SNzMgXn8GLykLw.png" /><figcaption>Folder structure for an Nx Workspace</figcaption></figure><p>Pretty straight forward. Then we add some navigation markup and a footer. We have plans for a “message of the day” in the nav and we are ready to implement the service logic for it.</p><p>So we start thinking about where in the app folder structure we are going to put that. Do we create a core directory since this will be core application functionality? Or do we create a shared directory because we will be using it across feature modules and “shared” implies the intent better? Oh, and if we do go with one of those, should we create a nested backend directory since we feel we will have more than one code file for that?</p><blockquote>Let’s tell that planning voice in our head to zip it, we’ve got this!</blockquote><p>Nx provides us a place to put it and a way to create it. Ready to build out that backend service code?</p><pre>ng g lib backend-provider</pre><blockquote>Tip: the g is an alias for the generate command</blockquote><p>Since it’s so easy to create a new Angular module lib in the workspace and there is an organizational pattern for where those libs go, we can remove the decision making and manual file creation from the equation and get to implementing the code.</p><p>And once we have made a home for this code, it’s easy to start adding to it:</p><pre>ng g service backend -a=backend-provider<br><br>ng g class helpers -a=backend-provider</pre><blockquote>Tip: the -a is the alias for the app option that tells the schematic which Angular CLI app to add it to (and libs get created as app entries in the Angular CLI configuration)</blockquote><p>And these libs give us an isolated domain of code. With the index.ts file for each lib we can control the public api of our modules. Export what we want to allow to be imported, leave out the rest.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a03d2436542cd4a5b9859efe14a03e1c/href">https://medium.com/media/a03d2436542cd4a5b9859efe14a03e1c/href</a></iframe><p>Then we can use it in the app with the short path that is mapped for us by Nx:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8611a4c6329c1bb0e2d50ac3cc15d342/href">https://medium.com/media/8611a4c6329c1bb0e2d50ac3cc15d342/href</a></iframe><p>Okay, the backend logic is implemented and being used to get that “message of the day” in our application. Now we’re ready to add our first feature module to display orders. And that voice in our head kicks in and starts again with the “should I create a features directory in the app and nest in there…”.</p><blockquote>And we yell “silence, we are Nx’ing!”</blockquote><p>Time for a new feature module? We’re on it. We can even set it up to be lazy loaded by passing the routing and lazy flags, and we can use the parentModule flag to add the route to the loadChildren in that customer-portal app:</p><pre>ng g lib orders --routing --lazy --parentModule=apps/customer-portal/src/app/app.module.ts</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BaFUQmHpj4LCZPN5_KsvWA.gif" /></figure><p>From there we build out the components within the lib. Then we can add a router link in our customer-portal app so our users can get to it and we are off and running with our feature. And the nice thing about this is the additions to our app are minimal.</p><p>As we start to build out our workspace code this way we can start to see the advantages of putting our Angular application code within lib modules. If our application domain consists of a customer portal app to begin with and we add an admin app later on, our lib code is already organized in a spot outside of the customer portal app. So we don’t have to fuss with any file/folder restructuring and we can implement more rapidly.</p><p>When we add that admin app we can use the existing BackendProviderModule code in the same fashion that we did for the customer portal app.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Itm-twZTpCXePug6RktF5w.png" /></figure><p>When we need to refactor the BackendService and change a method name we can use our editor/IDE and it will update all usages in all apps/libs within our workspace. And if we commit and roll out that change and a critical code issue arises, we can rollback the commit and re-deploy with fairly minimal effort. The fact that we have an application domain mono repo makes these possible.</p><p>And reuse of that orders feature module across apps is simple too. But let’s say that the orders feature module is specific to the design of the customer portal app, but the order details component that it will have is something that can be used by both apps.</p><p>We can create an Angular module lib for that component (no need for routing on this one):</p><pre>ng g lib order-details<br><br>ng g component order-details -a=order-details --export</pre><p>Then we can import that module into the orders feature module and to the admin app. And if we need to make a change to it down the road, well, it’s the same story as those earlier changes to the BackendService. Low friction to implement and a clear and fast rollback process if needed.</p><p>Nx gives us some set patterns out of the box to organize our workspace code in a way that encourages modularity and it provides schematics to make the setup of those modules fast.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*zIC5hDd9ZeNg-C_FWMSWWg.png" /></figure><p>If you haven’t checked out <strong>Nx</strong> yet, head over to <a href="https://nrwl.io/nx">nrwl.io/nx</a> to learn more about it and how to get started using it.</p><h4>Justin Schwartzenberger provides training and guidance at <a href="http://nrwl.io/">Nrwl — Enterprise Angular Consulting.</a></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/422/1*s76h75v7CB7g4EuxVNaGkg.png" /></figure><p><em>If you liked this, give it a clap (or a few) so other people will see this here on Medium. Follow @schwarty to read more about Angular.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d6d3899e8343" width="1" height="1" alt=""><hr><p><a href="https://medium.com/nrwl/how-nx-helps-to-encourage-teams-to-modularize-code-d6d3899e8343">How Nx Helps to Encourage Teams to Modularize Code</a> was originally published in <a href="https://medium.com/nrwl">Nx Devtools</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AngularConnect 2017 and the Nrwl Pod]]></title>
            <link>https://medium.com/nrwl/angularconnect-2017-and-the-nrwl-pod-feba2a4a89ea?source=rss-a9286c256648------2</link>
            <guid isPermaLink="false">https://medium.com/p/feba2a4a89ea</guid>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[angularconnect]]></category>
            <dc:creator><![CDATA[Justin Schwartzenberger]]></dc:creator>
            <pubDate>Sat, 11 Nov 2017 00:42:58 GMT</pubDate>
            <atom:updated>2017-11-11T00:42:58.057Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fqTVBj3uov0siMEi4Bbnuw.jpeg" /><figcaption>Victor Savkin on stage at AngularConnect 2017 © Katura Jensen</figcaption></figure><p>Another year of <a href="https://angularconnect.com/2017">AngularConnect</a> came and went, and once again the level of content and community engagement was of the highest of quality. This year the entire <a href="https://nrwl.io/#founders">Nrwl team</a> was on location delivering workshops, talks and Q and A sessions. It was great to spend time with other amazing Angular community members, talk shop (and a lot of <a href="https://nrwl.io/nx">Nx</a>) and watch some really solid and inspiring talks.</p><blockquote>DYK: A group of Narwhals is called a “pod”</blockquote><p>With the recent release of Angular Version 5 there was a lot of excitement around improved performance (both runtime and build time improvements), from service workers and pre-rendering to build optimizations within the Angular CLI. And of course, there were plenty of talks covering good practices and conventions.</p><p>Let’s do a quick recap of what the Nrwl team covered and point out some other picks.</p><h3>Nrwl Talks</h3><p><a href="https://twitter.com/jeffbcross">Jeff Cross</a> provided encouragement for teams to start pre-rendering their Angular applications and guidance as to when and where to pre-render in his <a href="https://youtu.be/JhNo3Wvj6UQ?t=2h13m32s"><strong>Pre-Rendering Strategies</strong></a> talk.</p><p><a href="https://twitter.com/AysSomething">Ayşegül Yönet</a> took us into the land of augmented and virtual reality in her <a href="https://youtu.be/__H65AsA_bE?t=1h7m27s"><strong>Exciting World of WebVR</strong></a> talk, outlining both and examining how cameras and scenes are implemented.</p><p><a href="https://twitter.com/victorsavkin">Victor Savkin</a> covered one of the most requested topics in the Angular community right now, illustrating the benefits of state and different strategies for implementation in his talk on <a href="https://youtu.be/ZNTsdaZiqP8?t=3h29m44s"><strong>State Management Patterns and Best Practices with NgRx</strong></a>.</p><h3>Nrwl Workshops</h3><p>We had two workshops that we ran at the start of the conference. Victor taught the one on <strong>Upgrading From AngularJS to Angular: An Incremental Approach</strong>. Jeff and I delivered the one on <strong>Building High Performance PWAs</strong> (Progressive Web Applications). Workshops are one of the services we provide for our clients and are something we are passionate about, so it was great to get the opportunity to deliver these to members of the community at AngularConnect. Both the upgrade and the PWA workshops are available as private workshops to Nrwl customers, so shoot us a note at <a href="/service/mailto:hello@nrwl.io">hello@nrwl.io</a> if you’d like to train your team!</p><h3>Picks</h3><p>Of course, the Nrwl team wasn’t the only ones providing content for the community during AngularConnect. All of the talks this year were amazing, and here are a few that I recommend you catch (or start out with):</p><ul><li><a href="https://youtu.be/DWet6RvhHWI?t=1h51m37s"><strong>Purely Fast</strong></a> by <a href="https://twitter.com/mgechev">Minko Gechev</a> (a must watch for all Angular devs)</li><li><a href="https://youtu.be/JhNo3Wvj6UQ?t=43m24s"><strong>Advanced Angular Concepts</strong></a> by <a href="https://twitter.com/synalx">Alex Rickabaugh</a></li><li><a href="https://youtu.be/ZNTsdaZiqP8?t=1h24m39s"><strong>Angular Elements</strong></a> by <a href="https://twitter.com/robwormald">Rob Wormald</a></li><li><a href="https://youtu.be/Rt38N-Uek0s?t=9m21s"><strong>Components are the New Thin Clients</strong></a> by <a href="https://twitter.com/bonnster75">Bonnie Brennan</a> and <a href="https://twitter.com/simpulton">Lukas Ruebbelke</a></li><li><a href="https://youtu.be/htQJ1JtvxNs?t=16m4s"><strong>Day One Keynote</strong></a> by <a href="https://twitter.com/jules_kremer">Jules Kremer</a> and <a href="https://twitter.com/IgorMinar">Igor Minar</a></li><li><a href="https://youtu.be/Rt38N-Uek0s?t=1h18m28s"><strong>Manage Your Huge Codebase like a Boss</strong></a> by <a href="https://twitter.com/jeffwhelpley">Jeff Whelpley</a></li></ul><p>You can also check out all of the talks from both days on the <a href="https://www.youtube.com/channel/UCzrskTiT_ObAk3xBkVxMz5g/videos">AngularConnect YouTube channel</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=feba2a4a89ea" width="1" height="1" alt=""><hr><p><a href="https://medium.com/nrwl/angularconnect-2017-and-the-nrwl-pod-feba2a4a89ea">AngularConnect 2017 and the Nrwl Pod</a> was originally published in <a href="https://medium.com/nrwl">Nx Devtools</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ayşegül Joins Nrwl]]></title>
            <link>https://medium.com/nrwl/ay%C5%9Feg%C3%BCl-joins-nrwl-776daa067b12?source=rss-a9286c256648------2</link>
            <guid isPermaLink="false">https://medium.com/p/776daa067b12</guid>
            <category><![CDATA[webgl]]></category>
            <category><![CDATA[dataviz]]></category>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[braintrust]]></category>
            <dc:creator><![CDATA[Justin Schwartzenberger]]></dc:creator>
            <pubDate>Fri, 01 Sep 2017 21:27:08 GMT</pubDate>
            <atom:updated>2017-09-01T21:27:08.947Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qHpU00ajypuPkPbBzNSUgQ.jpeg" /><figcaption>Ayşegül delivering an intro to WebGL at Forward JS</figcaption></figure><p>We’re at it again, increasing our brain trust of Angular experts. In fact, increasing it by an order of magnitude with the announcement that <a href="https://twitter.com/AysSomething">Ayşegül Yönet</a> will be joining <a href="https://nrwl.io/">Nrwl</a>.</p><p>Now there’s a good chance you have seen Ayşegül present at many of the Angular conferences over the years, being that she actively shares her knowledge and experience with the community. And that knowledge and experience is vast, covering JavaScript and Web Development with a focus on Angular, WebVR and Data Visualization. Ayşegül is a Developer Expert at Google for Web Technologies and Angular and most recently worked as Senior Software Engineer for Autodesk Play, a 3D and VR authoring tool that is currently in beta.</p><p>Oh, and did we mention how much Ayşegül enjoys helping others? Beyond the conference talks, she has been graciously devoting time to making software skills attainable to traditionally underrepresented groups in the software industry. She prepared curriculums and taught workshops for <a href="https://www.girldevelopit.com/">Girl Develop It</a> in San Francisco and has led <a href="https://www.womenwhocode.com/">Women Who Code</a> meetups teaching JavaScript to various levels of students. She also mentored in the <a href="https://thelastmile.org/">Last Mile Project</a> in San Quentin Prison, <a href="http://www.blackgirlscode.com/">Black Girls Code</a> and the <a href="http://www.computerclubhouse.org/">Computer Clubhouse</a> organizations. Ayşegül even spent time in recent years helping to transform survivors of human trafficking into software professionals when she was CTO of <a href="https://www.anniecannons.com/">AnnieCannons</a>.</p><p>Our mission here at Nrwl is to help teams be successful on ambitious Angular projects and provide them with access to unparalleled expertise. We couldn’t be more proud to have Ayşegül on board to help us deliver on that mission. If you want to get to know Ayşegül, say hi on Twitter (<a href="https://twitter.com/AysSomething">@AysSomething</a>), or check out some of her work:</p><ol><li><a href="https://youtu.be/DTjLcLytNt8">Introduction to working with D3.js</a> (SFHTML5)</li><li><a href="https://youtu.be/ez8Mfzd9gNs">Creating WebGL Components with Angular</a> (AngularConnect)</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=776daa067b12" width="1" height="1" alt=""><hr><p><a href="https://medium.com/nrwl/ay%C5%9Feg%C3%BCl-joins-nrwl-776daa067b12">Ayşegül Joins Nrwl</a> was originally published in <a href="https://medium.com/nrwl">Nx Devtools</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using ngrx store-devtools with the Angular CLI]]></title>
            <link>https://medium.com/schwarty-blog/using-ngrx-store-devtools-with-the-angular-cli-a3b5f88f12e9?source=rss-a9286c256648------2</link>
            <guid isPermaLink="false">https://medium.com/p/a3b5f88f12e9</guid>
            <category><![CDATA[angular-cli]]></category>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[ngrx]]></category>
            <category><![CDATA[angular2]]></category>
            <category><![CDATA[store-devtools]]></category>
            <dc:creator><![CDATA[Justin Schwartzenberger]]></dc:creator>
            <pubDate>Mon, 19 Jun 2017 23:57:37 GMT</pubDate>
            <atom:updated>2017-08-08T23:15:28.520Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZInIahkoetahSRe-l9onkQ.png" /><figcaption>Background Pic by Barn Images on Unsplash</figcaption></figure><p>If you’ve used <a href="https://github.com/ngrx/platform">ngrx</a>, the reactive extensions library for Angular, you are probably familiar with the fact that the suite of @ngrx packages has a <a href="https://github.com/ngrx/platform/blob/master/docs/store-devtools/README.md">store-devtools</a> scoped package that provides a way to debug your state store and dispatched actions. And if you have used the store-devtools you are probably familiar with the fact that you need to import the result of a call to StoreModule.instrument() in your root Angular NgModule after you import the store in order to wire up the store-devtools to your app.</p><blockquote>Note: Examples are for @ngrx/store-devtools version <strong>4.0.0</strong> and above</blockquote><p>This is great for dev time. But when it comes time to build for production we don’t want that instrumentation in the NgModule that we ship. Now we can solve this in a few different ways. We could have a different NgModule that we bootstrap for dev and for prod, or we could have a helper method that returns an array of imports based on some configuration.</p><p>But if we are using the <a href="https://github.com/angular/angular-cli">Angular CLI</a> there is an easy way to tackle this. We can make use of the built in <a href="https://github.com/angular/angular-cli/wiki/stories-application-environments">environment</a> support. A new project generated by the Angular CLI comes with 2 environment files out of the box, environment.prod.ts and environment.ts, that will be used when serving/building for prod and dev respectively.</p><p><strong>environment.prod.ts</strong></p><pre>export const environment = {<br>  production: true,<br>}</pre><p><strong>environment.ts</strong></p><pre>export const environment = {<br>  production: false,<br>}</pre><h4>Use environment to conditionally wire up store devtools</h4><p>We can add a property to that environment const that can be an array of imports that we want to add to our root Angular NgModule and leave that empty for the prod version:</p><p><strong>environment.prod.ts</strong></p><pre>export const environment = {<br>  production: true,<br>  imports: []<br>}</pre><p>And then put the instrumentation in the one for the dev version:</p><p><strong>environment.ts</strong></p><pre>import { StoreDevtoolsModule } from &#39;@ngrx/store-devtools&#39;;</pre><pre>export const environment = {<br>  production: false,<br>  imports: [<br>    StoreDevtoolsModule.instrument({maxAge:5})<br>  ]<br>}</pre><p>Then we can hop over to our single root Angular NgModule for our application and use the environment.imports property we set up:</p><p><strong>app.module.ts</strong></p><pre>import { BrowserModule } from &#39;@angular/platform-browser&#39;;<br>import { NgModule } from &#39;@angular/core&#39;;<br>import { AppComponent } from &#39;./app.component&#39;;<br>import { StoreModule } from &#39;@ngrx/store&#39;;<br>import { environment } from &#39;../environments/environment&#39;;</pre><pre>@NgModule({<br>  declarations: [AppComponent],<br>  imports: [<br>    BrowserModule,<br>    StoreModule.provideStore(/* reducer here */),<br>    // Note that you must instrument after importing StoreModule<br>    <strong><em>environment.imports</em></strong><br>  ],<br>  bootstrap: [AppComponent]<br>})</pre><pre>export class AppModule { }</pre><p>Because the Angular CLI handles swapping in the appropriate environment file pre-build we are able to leverage that environment const to get things included in our app. And not only things, but <strong>typed things</strong> like class types that we need to bring in via an import statement. This is super powerful for not only situations like this with the @ngrx/store-devtools, but for many other cases we may need to handle in our Angular applications.</p><p>One final note here, we can name that property whatever we want and even craft that environment const with a nested object structure. So there is nothing forcing us to name it imports. We could have called it ngrxImports or even nest it at rootImports.ngrx or something along those lines. We have total control over it so we can really leverage it to construct any type of solution we need!</p><p><em>Have a Lynda.com or LinkedIn Learning account?</em></p><p><em>Learn the essentials of Angular (version 2+)</em><strong><em> </em></strong><a href="https://www.lynda.com/AngularJS-tutorials/Angular-2-Essential-Training/540347-2.html"><strong><em>Watch Now</em></strong></a><strong><em><br></em></strong><em>Learn Angular Reactive Forms</em><strong><em> </em></strong><a href="https://www.lynda.com/AngularJS-tutorials/Angular-2-Forms-Data-Binding-Validation/461451-2.html"><strong><em>Watch Now</em></strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a3b5f88f12e9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/schwarty-blog/using-ngrx-store-devtools-with-the-angular-cli-a3b5f88f12e9">Using ngrx store-devtools with the Angular CLI</a> was originally published in <a href="https://medium.com/schwarty-blog">Schwarty Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Ng-Cruise Value Proposal: Why You Should Be On That Boat]]></title>
            <link>https://medium.com/schwarty-blog/a-ng-cruise-value-proposal-why-you-should-be-on-that-boat-5cc40583cfe9?source=rss-a9286c256648------2</link>
            <guid isPermaLink="false">https://medium.com/p/5cc40583cfe9</guid>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[ngcruise]]></category>
            <category><![CDATA[angularjs]]></category>
            <category><![CDATA[conference]]></category>
            <dc:creator><![CDATA[Justin Schwartzenberger]]></dc:creator>
            <pubDate>Sat, 21 Jan 2017 21:33:54 GMT</pubDate>
            <atom:updated>2017-01-22T01:51:24.259Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*edOfJqXDTsKil2_dSMaQ3g.png" /><figcaption><em>Ship image from </em>royalcaribbean.com</figcaption></figure><p>I’ve been to a ton of tech conferences over the past several years. Always in search of more personal knowledge, more growth and more exposure to new things. They can be a great source for these. Yet, they always feel like there is an aspect that is missing…that they could be <em>more </em>than what they are.</p><p>I think this stems from the fact that they are typically a one-way data flow. You attend a 2–3 day conference, jump from session to session receiving content, eat lunch/snacks with a herd, attend a mingle party, then head back home to your work cycle. You take notes on things to look into, code to try and new people to follow on Twitter. A good solid source of information and knowledge.</p><p>But, you know, you were <strong><em>this close</em></strong> to other devs for those two days. Other devs that are doing the same things you do, talking the same shop and imagining the same architectural solutions. But the condensed conference schedule and rapid pace of content delivery left you little to no time to network.</p><blockquote>I sense that <a href="https://ngcruise.com/">Ng-Cruise</a> will be a different experience.</blockquote><h3>Tracy Lee | ladyleet on Twitter</h3><p>Just in! @ngcruise shirts! #youcancruisewithus #ngcruise // @josepheames @gerardsans @EmberSherpa #angularjs</p><p>Now, I’ve never been to a conference on a cruise before. Hell, I’ve never even been on a cruise. But when this one was announced I felt I had to find a way onto that boat. It was going to be an opportunity to not only gain more Angular knowledge but to also engage in what could be a <em>meeting of the minds</em> type of moment.</p><p>I feel like it’s setting up to be more of a week long Angular collaboration and discussion with the addition of some focused sessions that will serve as conversation starters. Here are the 3 main points that I think Ng-Cruise has going for it that make it one of the more valuable returns on investment for your conference attendance plans of 2017:</p><ul><li>It spans five days</li><li>The crowd will be lighter and the speakers will be available</li><li>The setting is conducive to thought and theory discussion</li></ul><p>The cruise sets sail on a Monday and returns on a Friday. The session content is dispersed over that time, with plenty of time available around it to interact and engage. This means that even with that 2 day warm up it may take you to start making new connections and feel comfortable interacting with other devs, you will have a whopping 3 more days to actually follow up on those new connections and get down to business discussing Angular.</p><p>This time span is going to be key. Other conferences leave you feeling rushed to squeeze everything in. On the cruise, time will be removed from that equation.</p><p>I feel like the attendee size of Ng-Cruise will be smaller than most conferences, making it easier to connect with not only other attendees but also with the speakers and organizers. Everyone will be hanging out together for those five days, not just bumping into one another in the hallway from 8–6 at the conference center. Connections will be easier to make, discussions will have ample time to flourish.</p><p>And then there’s the setting. The Caribbean. Sure, everyone has their own vision of paradise and the tropics may not be that. But, it does have a natural way of eliciting a sense of <em>“chill out ’cause there ain’t nothin’ else goin’ on around here right now” </em>that one really doesn’t get when they attend a conference in the city. I think that this setting is going to activate the brain and the soul. I feel that the discussions that go down during the cruise will generate ideas, approaches and theories that can impact the future of Angular and the future of the web.</p><p>So, I will be on that boat. <a href="https://ngcruise.com/#/talks#schwarty">In fact, I will be doing a talk on that boat.</a> And while I am stoked to be able to present and to share that content…I am super geeked up to spend 5 days collaborating with fellow devs, immersing myself in Angular with no other distractions. I can’t wait to do more than just one-way stream content. I’ll be on that boat, with an open socket the whole time. I think it’ll be worth while for you to find your way on and connect!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/187/1*z9Fvzc8Lx1DM25srNc1kww.png" /></figure><p><a href="https://ngcruise.com/">ngcruise.com</a><br>May 29, 2017!<br><a href="https://ngcruise.com/#/tickets-terms#tickets-terms">Tickets are still available!</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5cc40583cfe9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/schwarty-blog/a-ng-cruise-value-proposal-why-you-should-be-on-that-boat-5cc40583cfe9">A Ng-Cruise Value Proposal: Why You Should Be On That Boat</a> was originally published in <a href="https://medium.com/schwarty-blog">Schwarty Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Migrating model driven forms to the new forms API in Angular 2]]></title>
            <link>https://medium.com/schwarty-blog/migrating-model-driven-forms-to-the-new-forms-api-in-angular-2-8dcff8fa9a92?source=rss-a9286c256648------2</link>
            <guid isPermaLink="false">https://medium.com/p/8dcff8fa9a92</guid>
            <category><![CDATA[angular2]]></category>
            <category><![CDATA[forms]]></category>
            <dc:creator><![CDATA[Justin Schwartzenberger]]></dc:creator>
            <pubDate>Mon, 18 Jul 2016 22:20:00 GMT</pubDate>
            <atom:updated>2017-06-08T18:19:29.722Z</atom:updated>
            <content:encoded><![CDATA[<p>If you built model driven forms with Angular pre <strong>@2.0.0-rc.2</strong> you were using classes like Control, ControlGroup and ControlArray and directives like ngControlName. As of Angular <strong>@2.0.0-rc.2</strong> we received a new forms api to work with. So what&#39;s the migration story to get our forms in line?</p><blockquote><strong>Version Note:</strong> <br><br> This post is based on Angular version <strong>@2.0.0-rc.5</strong> (with NgModule) <br><br> and the new Angular forms api package version <strong>0.3.0</strong></blockquote><blockquote><strong>Language Note:</strong> <br><br> Examples are in TypeScript</blockquote><p>Check out the <a href="http://plnkr.co/edit/REoGIP?p=info">live example</a> of this code on <a href="http://plnkr.co/">Plunker</a></p><h4>First things first, vendor and bootstrap it up</h4><p>The old forms api has been deprecated with the intent of removing it in the future. To use the new api we need to bring in a new package.</p><p>The first difference we encounter with the new forms api is that there is a separate scoped package for forms: @angular/forms.</p><p>The old forms were included in the common scoped package. The move to a separate scoped package is probably a good thing, as it allows us to decide if we want to include the extra payload in the platform when we spin it up for our app. That being said, I can&#39;t recall working on an app that didn&#39;t have at least some type of HTML form markup. But choices are good, and being able to be explicit on what we choose to deliver in our apps with the platform is a win for us!</p><p>This means we need to grab the Angular forms scoped package and add @angular/forms to the list of ones we need to load. How to do this will depend on how you are handling your vendor scripts and module loading, but if you are using npm and systemjs it would look something like this:</p><p><strong>package.json</strong></p><pre>{<br>  ...<br>  &quot;dependencies&quot;: {<br>    ...<br>    &quot;@angular/forms&quot;: &quot;0.3.0&quot;,<br>    ...<br>  }<br>}</pre><p><strong>system-config.ts</strong></p><pre>...<br>const barrels: string[] = [  <br>  // Angular specific barrels.<br>  ...<br>  &#39;@angular/forms&#39;,<br>  ...<br>];<br>...</pre><p>Or, if you are using the latest <a href="https://webpack.github.io/">webpack</a> version of the <a href="https://github.com/angular/angular-cli">angular-cli</a> all you need to do is add it to the package.json file.</p><p>We also need to make use of the new modules available for forms. There are two, one for the <strong>template driven approach</strong> and one for the <strong>model driven approach (reactive)</strong>:</p><ul><li>FormsModule (template)</li><li>ReactiveFormsModule (model)</li></ul><p>Since we are focusing on the model (reactive) approach we need to add that one to our module imports property. If you have an AppModule it would look something like this:</p><pre>import { NgModule } from &#39;@angular/core&#39;;  <br>import { BrowserModule } from &#39;@angular/platform-browser&#39;;  <br>import { ReactiveFormsModule } from &#39;@angular/forms&#39;;</pre><pre>import { AppComponent }  from &#39;./app.component&#39;;  <br>import { OrderFormComponent } from &#39;./order-form.component&#39;;</pre><pre>@NgModule({<br>  imports: [<br>    BrowserModule,<br>    ReactiveFormsModule<br>  ],<br>  declarations: [AppComponent, OrderFormComponent],<br>  bootstrap: [AppComponent]<br>})<br>export class AppModule { }</pre><pre>Change that component class model code</pre><pre>Next we need to make some modifications to the component classes where we were <em>previously</em> setting up our form representation using the newly deprecated ControlGroup. Since forms type stuff is now in its own barrel, we need to update the import statement to import from @angular/forms instead of @angular/common.</pre><pre>import { FormBuilder } from `@angular/forms&#39;;</pre><pre>All of the new forms api stuff is going to come from this barrel. Any additional <em>things</em> we need to bring in will come from this import statement. And speaking of those <em>form things</em>, the three essential building blocks for forms, Control, ControlGroup and ControlArray have been renamed.</pre><ul><li>Control is now FormControl</li><li>ControlGroup is now FormGroup</li><li>ControlArray is now FormArray</li></ul><pre>So using the model driven approach to build out a form representation using a new form group and adding blocks to it would now look like:</pre><pre>import { Component } from &#39;@angular/core&#39;;  <br>import { FormGroup, FormControl, FormArray } from &#39;@angular/forms&#39;;</pre><pre>@Component({<br>  ...<br>})<br>export class OrderFormComponent {  <br>  orderForm: FormGroup;</pre><pre>constructor () {<br>    this.orderForm = new FormGroup({<br>      customerName: new FormControl(null),<br>      syrups: new FormGroup({<br>        vanilla: new FormControl(null),<br>        caramel: new FormControl(null),<br>        hazelnut: new FormControl(null)<br>      }),<br>      specialRequests: new FormArray([<br>        new FormControl(null)<br>      ])<br>    });<br>  }</pre><pre>onSubmitForm () {<br>    console.log(this.orderForm.value);<br>  }</pre><pre>onAddSpecialRequest () {<br>    this.orderForm.controls<br>      .specialRequests.push(new FormControl(null));<br>  }</pre><pre>onRemoveSpecialRequest (index) {<br>    this.orderForm.controls[&#39;specialRequests&#39;].removeAt(index);<br>  }<br>}</pre><pre>But, if you were making use of the FormBuilder class the transition is even easier! That class remained mostly the same. So if you were using the methods on FormBuilder to craft your form representation then your changes are minimal:</pre><pre>import { Component } from &#39;@angular/core&#39;;  <br>import { FormGroup, FormBuilder } from &#39;@angular/forms&#39;;</pre><pre>@Component({<br>  ...<br>})<br>export class OrderFormComponent {  <br>  ...</pre><pre>constructor (private formBuilder: FormBuilder) {<br>    this.orderForm = formBuilder.group({<br>      customerName: formBuilder.control(null),<br>      syrups: formBuilder.group({<br>        vanilla: formBuilder.control(null),<br>        caramel: formBuilder.control(null),<br>        hazelnut: formBuilder.control(null)<br>      }),<br>      specialRequests: formBuilder.array([<br>        formBuilder.control(null)<br>      ])<br>    });<br>  }</pre><pre>...</pre><pre>onAddSpecialRequest () {<br>    this.orderForm.controls<br>      .specialRequests.push(this.formBuilder.control(null));<br>  }</pre><pre>...<br>}</pre><pre>Give that template new directives</pre><pre>Finally we need to update the component template markup to handle form directive changes.</pre><pre>Some of the key directive changes are as follows:</pre><ul><li>Instead of ngFormModel use formGroup (on the &lt;form&gt; element)</li><li>Instead of ngControl use formControlName (for named form controls)</li><li>Instead of ngControlGroup use formGroupName (for named form groups)</li><li>Instead of ngControlGroup use formArrayName (for named form arrays)</li></ul><pre>So our template HTML will now look like:</pre><pre>&lt;form [formGroup]=&quot;orderForm&quot; (ngSubmit)=&quot;onSubmitForm()&quot;&gt;  <br>  &lt;label for=&quot;name&quot;&gt;Your Name&lt;/label&gt;<br>  &lt;input id=&quot;name&quot; type=&quot;text&quot; formControlName=&quot;customerName&quot;&gt;<br>  &lt;p&gt;Add syrups&lt;/p&gt;<br>  &lt;ul formGroupName=&quot;syrups&quot;&gt;<br>    &lt;li&gt;<br>      &lt;input id=&quot;vanilla&quot; type=&quot;checkbox&quot; formControlName=&quot;vanilla&quot;&gt;<br>      &lt;label for=&quot;vanilla&quot;&gt;vanilla&lt;/label&gt;<br>    &lt;/li&gt;<br>    &lt;li&gt;<br>      &lt;input id=&quot;caramel&quot; type=&quot;checkbox&quot; formControlName=&quot;caramel&quot;&gt;<br>      &lt;label for=&quot;caramel&quot;&gt;caramel&lt;/label&gt;<br>    &lt;/li&gt;<br>    &lt;li&gt;<br>      &lt;input id=&quot;hazelnut&quot; type=&quot;checkbox&quot; formControlName=&quot;hazelnut&quot;&gt;<br>      &lt;label for=&quot;hazelnut&quot;&gt;hazelnut&lt;/label&gt;<br>    &lt;/li&gt;<br>  &lt;/ul&gt;<br>  &lt;section&gt;<br>    &lt;p&gt;Any special requests?&lt;/p&gt;<br>    &lt;ul formArrayName=&quot;specialRequests&quot;&gt;<br>      &lt;li *ngFor=&quot;let item of orderForm.controls.specialRequests.controls; let i = index&quot;&gt;<br>        &lt;input type=&quot;text&quot; formControlName=&quot;{{i}}&quot;&gt;<br>        &lt;button type=&quot;button&quot; title=&quot;Remove Request&quot; <br>          (click)=&quot;onRemoveSpecialRequest(i)&quot;&gt;Remove&lt;/button&gt;<br>      &lt;/li&gt;<br>    &lt;/ul&gt;<br>    &lt;button type=&quot;button&quot; (click)=&quot;onAddSpecialRequest()&quot;&gt;<br>      Add a Request<br>    &lt;/button&gt;<br>  &lt;/section&gt;<br>  &lt;button type=&quot;submit&quot; [disabled]=&quot;!orderForm.valid&quot;&gt;<br>    Place Order<br>  &lt;/button&gt;<br>&lt;/form&gt;</pre><pre>That it?</pre><pre>I&#39;d say that covers the most common changes we have to make to migrate to the new forms api. There are a few more specific changes (for things like radio controls, working with validation in the template, etc.). Maybe those will get covered in an upcoming blog post. :)</pre><pre>Check out the <a href="http://plnkr.co/edit/REoGIP?p=info">live example</a> of this code on <a href="http://plnkr.co/">Plunker</a></pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8dcff8fa9a92" width="1" height="1" alt=""><hr><p><a href="https://medium.com/schwarty-blog/migrating-model-driven-forms-to-the-new-forms-api-in-angular-2-8dcff8fa9a92">Migrating model driven forms to the new forms API in Angular 2</a> was originally published in <a href="https://medium.com/schwarty-blog">Schwarty Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Checking for Angular 2 @output wire up]]></title>
            <link>https://medium.com/schwarty-blog/checking-for-angular-2-output-wire-up-5fbe4bafadb7?source=rss-a9286c256648------2</link>
            <guid isPermaLink="false">https://medium.com/p/5fbe4bafadb7</guid>
            <category><![CDATA[output]]></category>
            <category><![CDATA[angular2]]></category>
            <dc:creator><![CDATA[Justin Schwartzenberger]]></dc:creator>
            <pubDate>Wed, 13 Jul 2016 21:57:27 GMT</pubDate>
            <atom:updated>2017-06-08T18:19:25.595Z</atom:updated>
            <content:encoded><![CDATA[<p>Making use of the @Output decorator for Angular 2 components is a great way to provide communication of actions back from the component to parent components in the component tree. But is there a way for these components to know if parent components are making use of the @Output binding? Why yes, there is!</p><blockquote><strong>Version Note:</strong> <br><br> This post is based on Angular version <strong>@2.0.0-rc.4</strong></blockquote><blockquote><strong>Language Note:</strong> <br><br> Examples are in TypeScript</blockquote><h4>Why would we want to check for @Output binding?</h4><p>Let’s say we are creating a confirmation toolbar component that will have a <strong>confirm</strong> and <strong>cancel</strong> button and we wanted those buttons to be optional for implementors of our component. Meaning that we want the ability to use the component in multiple ways:</p><pre>&lt;confirmation-toolbar  <br>  (confirm)=&quot;onConfirm()&quot;<br>  (cancel)=&quot;onCancel()&quot;&gt;<br>&lt;/confirmation-toolbar&gt;</pre><p>or</p><pre>&lt;confirmation-toolbar  <br>  (confirm)=&quot;onConfirm()&quot;&gt;<br>&lt;/confirmation-toolbar&gt;</pre><p>or</p><pre>&lt;confirmation-toolbar  <br>  (cancel)=&quot;onCancel()&quot;&gt;<br>&lt;/confirmation-toolbar&gt;</pre><p>And then in our confirmation toolbar component template we wanted to conditionally render the buttons depending on if the outputs were wired up:</p><pre>&lt;ul&gt;  <br>  &lt;li *ngIf=&quot;showConfirm&quot;&gt;<br>    &lt;button (click)=&quot;onConfirmClicked()&quot;&gt;<br>      Confirm<br>    &lt;/button&gt;<br>  &lt;/li&gt;<br>  &lt;li *ngIf=&quot;showCancel&quot;&gt;<br>    &lt;button (click)=&quot;onCancelClicked()&quot;&gt;<br>      Cancel<br>    &lt;/button&gt;<br>  &lt;/li&gt;<br>&lt;/ul&gt;</pre><p>We would need to find a way to set the showConfirm and showCancel properties for our component. Now we could create corresponding @Input decorators for those, but then we would be putting it on the implementors of the component to add additional bindings to use the component.</p><h4>How to work it</h4><p>We can avoid all that noise by checking for @Output bindings in our component. Outputs are set up as EventEmitters, which are Observables. That means we can check to see if there are any subscribers and act accordingly.</p><p>Now just like @Input bindings, @Output bindings are not made available to the component until the ngOnInit lifecycle event or after.</p><p>So to check for @Output wire up in our component classes we can do the following:</p><pre>import { Component, Output, EventEmitter } from &#39;@angular/core&#39;;</pre><pre>@Component({<br>  selector: &#39;confirmation-toolbar&#39;,<br>  template: `<br>    &lt;ul&gt;<br>      &lt;li *ngIf=&quot;showConfirm&quot;&gt;<br>        &lt;button (click)=&quot;onConfirmClicked()&quot;&gt;<br>          Confirm<br>        &lt;/button&gt;<br>      &lt;/li&gt;<br>      &lt;li *ngIf=&quot;showCancel&quot;&gt;<br>        &lt;button (click)=&quot;onCancelClicked()&quot;&gt;<br>          Cancel<br>        &lt;/button&gt;<br>      &lt;/li&gt;<br>    &lt;/ul&gt;<br>  `<br>})<br>export class ConfirmationToolbarComponent implements OnInit {  <br>  @Output() confirm = new EventEmitter();<br>  @Output() cancel = new EventEmitter();<br>  showConfirm = false;<br>  showCancel = false;</pre><pre>ngOnInit () {<br>    this.showConfirm = this.confirm.observers.length &gt; 0;<br>    this.showCancel = this.cancel.observers.length &gt; 0;<br>  }</pre><pre>onConfirmClicked () {<br>    this.confirm.emit(null);<br>  }</pre><pre>onCancelClicked () {<br>    this.cancel.emit(null);<br>  }<br>}</pre><pre>And with that, we have made use of checking the @Output wire up without needing some corresponding @Input used for configuration, keeping the usage of the component minimal and elegant!</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5fbe4bafadb7" width="1" height="1" alt=""><hr><p><a href="https://medium.com/schwarty-blog/checking-for-angular-2-output-wire-up-5fbe4bafadb7">Checking for Angular 2 @output wire up</a> was originally published in <a href="https://medium.com/schwarty-blog">Schwarty Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Some cool things that dropped in Angular 2 RC2]]></title>
            <link>https://medium.com/schwarty-blog/some-cool-things-that-dropped-in-angular-2-rc2-11008a1ce94f?source=rss-a9286c256648------2</link>
            <guid isPermaLink="false">https://medium.com/p/11008a1ce94f</guid>
            <category><![CDATA[angular2]]></category>
            <dc:creator><![CDATA[Justin Schwartzenberger]]></dc:creator>
            <pubDate>Thu, 16 Jun 2016 03:37:00 GMT</pubDate>
            <atom:updated>2017-06-08T18:19:34.723Z</atom:updated>
            <content:encoded><![CDATA[<p>We waited about a month and a half for the follow up to the RC1 that dropped back in May during <a href="https://www.ng-conf.org/#/">ngconf 2016</a>. Well, Angular 2 RC2 is finally here and it’s packed with a bunch of fixes and features.</p><blockquote><strong>Angular 2.0.0-rc.2</strong><br> <a href="https://github.com/angular/angular/blob/master/CHANGELOG.md">https://github.com/angular/angular/blob/master/CHANGELOG.md</a></blockquote><p>Here are some of the <strong>fixes</strong> I’m excited to see:</p><ul><li><strong>forms:</strong> radio buttons with different names should not share state (<a href="https://github.com/angular/angular/commit/6dc88f5">6dc88f5</a>), closes <a href="https://github.com/angular/angular/issues/7051">#7051</a> <br><br><em>Before this fix we weren’t able to have multiple radio button groups in a single form because the values of all radio inputs would get reset when one was selected.</em></li><li><strong>http:</strong> respect custom Content-Type header in XHRConnection (#9131) (<a href="https://github.com/angular/angular/commit/537e99b">537e99b</a>), closes <a href="https://github.com/angular/angular/issues/9130">#9130</a> <br><br><em>Always good to have the correct content type headers going across the wire in our API calls!</em></li><li><strong>router:</strong> opening links in new tab (<a href="https://github.com/angular/angular/commit/fa2ce81">fa2ce81</a>), closes <a href="https://github.com/angular/angular/issues/5908">#5908</a> <a href="https://github.com/angular/angular/issues/6806">#6806</a> <a href="https://github.com/angular/angular/issues/7749">#7749</a> <a href="https://github.com/angular/angular/issues/8806">#8806</a> <a href="https://github.com/angular/angular/issues/8821">#8821</a> <br><br><em>Before this fix a </em><em>ctrl+click or a middle mouse click would not open up a new tab in a browser. A good fix. There are some fundamental actions users are accustom to doing in the browser. Disrupting those can lead to confusion an angst about your application.</em></li></ul><p>And here are some of the <strong>features</strong> I found interesting:</p><ul><li><strong>animations</strong>: <em>Any and every bit of them! Been anxiously awaiting these. <br><br>Check out the </em><a href="https://angular.io/docs/ts/latest/guide/animations.html"><em>Animations</em></a><em> documentation in the Developer Guide section of the angular.io website.</em></li><li><strong>common:</strong> DatePipe supports ISO string (<a href="https://github.com/angular/angular/commit/abc266f">abc266f</a>), closes <a href="https://github.com/angular/angular/issues/7794">#7794</a> <br><br><em>One of our engineers, </em><a href="https://twitter.com/rich_code"><em>@rich_code</em></a><em>, actually implemented this in our code base a while back. Now he gets to do the best type of code refactoring there is…code deletion!</em></li><li><strong>forms:</strong> compose validator fns automatically if arrays (<a href="https://github.com/angular/angular/commit/61960c51a3b21d1cfba523f53016f6284182d4e3">61960c5</a>) <br><br><em>So no more need to use </em><em>Validators.compose() to chain together validators when using the </em><em>FormBuilder.control method or creating a new </em><em>FormControl. I dug through the source code and it doesn&#39;t appear that this is also supported for validator composition for </em><em>FormGroup or </em><em>FormArray objects. Not sure if this is intended to be left out or if we will get that in the future...</em></li><li><strong>ViewEncapsulation:</strong> default ViewEncapsulation to configurable (<a href="https://github.com/angular/angular/commit/f93512b">f93512b</a>), closes <a href="https://github.com/angular/angular/issues/7883">#7883</a> <br><br><em>Now we have a way to set the default view encapsulation mode from the top down for all components in our app if we don’t want to roll with the </em><em>ViewEncapsuation.Emulated mode that comes out of the box.</em></li></ul><p>Lots of fixes/features in RC2. Add these to the API changes that are in the works for <strong>forms</strong> and the <strong>router</strong> and we find ourselves working on top of “shifting sand” (as my buddy <a href="https://twitter.com/maindg">@maindg</a> likes to say). And here I thought the RCs would bring stability as we closed in on the final release. Oh well, such is the life in the rapidly changing domain of web development!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=11008a1ce94f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/schwarty-blog/some-cool-things-that-dropped-in-angular-2-rc2-11008a1ce94f">Some cool things that dropped in Angular 2 RC2</a> was originally published in <a href="https://medium.com/schwarty-blog">Schwarty Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>