<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  <title>Fireship - RSS Feed</title>
  <link>https://www.webhostingchannel.com/category.php?cat=fireship</link>
  <description>Fireship</description>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Reddit Inspired Upvoting System with Angular and Firebase NoSQL</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=d40c508c8</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/d40c508c8-1.jpg"  /></p>https://angularfirebase.com/lessons/reddit-style-upvoting-in-angular-4-and-firebase-nosql/<br />
<br />
Learn how to build a Reddit-style upvote/downvote system with Angular 4 and Firebase Realtime NoSQL database.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="347"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Reddit Inspired Upvoting System with Angular and Firebase NoSQL</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/d40c508c8-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;https://angularfirebase.com/lessons/reddit-style-upvoting-in-angular-4-and-firebase-nosql/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Learn how to build a Reddit-style upvote/downvote system with Angular 4 and Firebase Realtime NoSQL database.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/d40c508c8-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=d40c508c8</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Autocomplete Search with Angular4 and Firebase</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=9c9da7f40</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/9c9da7f40-1.jpg"  /></p>https://angularfirebase.com/lessons/autocomplete-search-with-angular4-and-firebase/<br />
<br />
Learn how to grab async data from firebase and update the UI after each keypress.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="276"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Autocomplete Search with Angular4 and Firebase</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/9c9da7f40-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;https://angularfirebase.com/lessons/autocomplete-search-with-angular4-and-firebase/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Learn how to grab async data from firebase and update the UI after each keypress.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/9c9da7f40-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=9c9da7f40</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Firebase Database Rules Tutorial</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=0a0cc6fa7</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/0a0cc6fa7-1.jpg"  /></p>https://angularfirebase.com/lessons/understanding-firebase-database-rules-by-example/<br />
<br />
Learn how to use Firebase database rules by example.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="312"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Firebase Database Rules Tutorial</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/0a0cc6fa7-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;https://angularfirebase.com/lessons/understanding-firebase-database-rules-by-example/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Learn how to use Firebase database rules by example.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/0a0cc6fa7-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=0a0cc6fa7</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Angular 4 Transactional Email with Google Firebase Cloud Functions</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=a006b1d18</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/a006b1d18-1.jpg"  /></p>https://angularfirebase.com/lessons/angular4-transactional-email-with-cloud-functions-and-sendgrid/<br />
<br />
In this episode, I am going to show you how send transactional email in Angular as a background task in cloud. To facilitate this, the emails will be send with Google Cloud Functions for Firebase and the email service Sendgrid. You can use any email provider you want such as mailgun or postmark or even Gmail, but I will chose Sendgrid for this tutorial because they have a solid helper library and a detailed NodeJS example in their documentation. They also offer a free trail with no credit card requirements, so get your API key to follow along with this lesson. <br />
<br />
What is a Cloud Function?<br />
<br />
Google Cloud Functions is a serverless architecture that allows you to run isolated code in a NodeJS runtime - as opposed to deploying your own server. It is Google's answer to AWS Lambda and has only been available to the public since 2017. It's an awesome tool for Firebase developers because it allows you to run code in the background that would otherwise slow down an Angular app,  and email is definitely a task that should be delegated to its own background task or micro service.  <br />
<br />
We can trigger cloud functions in many different ways, but this lesson will demonstrate the use of cloud functions via HTTP. When the function is deployed, Google Cloud Platform will give us a URL endpoint that we can hit with query params that tell SendGrid how to deliver the email. The process is no different than working with any other RESTful API. <br />
<br />
It's also useful to know that you can trigger cloud functions on database writes, storage uploads, authentication events, and even analytic events, all of which are common use cases for transactional email. Some examples include sending a welcome email after a new user signs up or when they've reached the max capacity on file uploads. I plan on covering these scenarios in future videos. <br />
<br />
First, I am assuming you have an Angular app started with the firebase-tools installed. <br />
<br />
Start by run the firebase init command and select functions. <br />
<br />
This will create a functions directory and give us an index.js file, which is were the functions are defined. The functions directory is its own isolated Node environment, completely separate from your angular app - its logic has no direct connection to angular. That's great because it keeps your frontend app lightweight and delegates CPU or Memory intensive operations to the cloud.  <br />
<br />
First we need to install the sendgrid package, so we cd into the functions directory then run NPM install. <br />
<br />
cd functions<br />
npm install sendgrid<br />
<br />
First, I import the send grid package and pass it my API key. <br />
<br />
Next, I define a parseBody helper to convert the email params into JSON with SendGrid's mail helper. This is a pretty powerful feature of SendGrid when it comes to formatting emails, so check out all the options in the documentation. <br />
<br />
To create a function, you use the exports keyword followed by the function name, in this case, Im calling the function httpEmail.  Our function will return a promise when triggered via HTTP, and if its successful, it will tell the send grid API to send an email.The request must be of type POST and should have query params that define the email addresses, subject, and content the email. Send grid will then return its own response letting us know if the email was successful or an exception occurred. <br />
<br />
Before we can wire up the cloud function with Angular, we need to deploy it.<br />
<br />
Run the firebase deploy command, flagging --only functions.<br />
<br />
When deployment is complete, the console will print the URL used trigger the function via HTTP. Make a note of this url because you will need it in the next step. <br />
<br />
<br />
In angular, we can call this function for anywhere in the app. Here I have a brand new send-email component that will trigger the function. <br />
<br />
Import the HTTP module and create a function that sends a POST request to the URL of the deployed function. I am also going to hard code some query parameters just to show how to send data to the function over http. In this example, I am just console logging the response or error for debugging. <br />
<br />
Now we can trigger the cloud function with a button click or any other event for that matter. <br />
<br />
If all went according to plan, you should see an email in your inbox. If not, make sure to check the console or the Firebase cloud functions logs for any exceptions. <br />
<br />
That's it for transactional email. Thanks for watching.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="339"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Angular 4 Transactional Email with Google Firebase Cloud Functions</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/a006b1d18-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;https://angularfirebase.com/lessons/angular4-transactional-email-with-cloud-functions-and-sendgrid/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In this episode, I am going to show you how send transactional email in Angular as a background task in cloud. To facilitate this, the emails will be send with Google Cloud Functions for Firebase and the email service Sendgrid. You can use any email provider you want such as mailgun or postmark or even Gmail, but I will chose Sendgrid for this tutorial because they have a solid helper library and a detailed NodeJS example in their documentation. They also offer a free trail with no credit card requirements, so get your API key to follow along with this lesson. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
What is a Cloud Function?&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Google Cloud Functions is a serverless architecture that allows you to run isolated code in a NodeJS runtime - as opposed to deploying your own server. It is Google&apos;s answer to AWS Lambda and has only been available to the public since 2017. It&apos;s an awesome tool for Firebase developers because it allows you to run code in the background that would otherwise slow down an Angular app,  and email is definitely a task that should be delegated to its own background task or micro service.  &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
We can trigger cloud functions in many different ways, but this lesson will demonstrate the use of cloud functions via HTTP. When the function is deployed, Google Cloud Platform will give us a URL endpoint that we can hit with query params that tell SendGrid how to deliver the email. The process is no different than working with any other RESTful API. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
It&apos;s also useful to know that you can trigger cloud functions on database writes, storage uploads, authentication events, and even analytic events, all of which are common use cases for transactional email. Some examples include sending a welcome email after a new user signs up or when they&apos;ve reached the max capacity on file uploads. I plan on covering these scenarios in future videos. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
First, I am assuming you have an Angular app started with the firebase-tools installed. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Start by run the firebase init command and select functions. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
This will create a functions directory and give us an index.js file, which is were the functions are defined. The functions directory is its own isolated Node environment, completely separate from your angular app - its logic has no direct connection to angular. That&apos;s great because it keeps your frontend app lightweight and delegates CPU or Memory intensive operations to the cloud.  &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
First we need to install the sendgrid package, so we cd into the functions directory then run NPM install. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
cd functions&amp;lt;br /&amp;gt;
npm install sendgrid&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
First, I import the send grid package and pass it my API key. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Next, I define a parseBody helper to convert the email params into JSON with SendGrid&apos;s mail helper. This is a pretty powerful feature of SendGrid when it comes to formatting emails, so check out all the options in the documentation. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
To create a function, you use the exports keyword followed by the function name, in this case, Im calling the function httpEmail.  Our function will return a promise when triggered via HTTP, and if its successful, it will tell the send grid API to send an email.The request must be of type POST and should have query params that define the email addresses, subject, and content the email. Send grid will then return its own response letting us know if the email was successful or an exception occurred. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Before we can wire up the cloud function with Angular, we need to deploy it.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Run the firebase deploy command, flagging --only functions.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
When deployment is complete, the console will print the URL used trigger the function via HTTP. Make a note of this url because you will need it in the next step. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In angular, we can call this function for anywhere in the app. Here I have a brand new send-email component that will trigger the function. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Import the HTTP module and create a function that sends a POST request to the URL of the deployed function. I am also going to hard code some query parameters just to show how to send data to the function over http. In this example, I am just console logging the response or error for debugging. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Now we can trigger the cloud function with a button click or any other event for that matter. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
If all went according to plan, you should see an email in your inbox. If not, make sure to check the console or the Firebase cloud functions logs for any exceptions. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
That&apos;s it for transactional email. Thanks for watching.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/a006b1d18-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=a006b1d18</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Loading Spinners for Asynchronous Firebase Data</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=d241fb52d</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/d241fb52d-1.jpg"  /></p>https://angularfirebase.com/lessons/show-loading-spinners-for-firebase-data/<br />
<br />
In this episode, I will show you how to display and hide a loading spinner when retrieving asynchronous Firebase data from an Angular application. Loading indicators are an important UI feature because they show the end user when more data is incoming.  <br />
<br />
Step 1 - Create the Spinner component<br />
<br />
We're going to create a SpinnerComponent that can be reused throughout the application. To make it look cool, I am using Spinkit CSS library, which we can just be copied directly into the component's CSS and HTML files. You do not need to change anything in the component's TypeScript. <br />
<br />
Step 2 - Retrieve Aschronous Data<br />
<br />
We need to load some data from Firebase to make use of the spinner.  <br />
<br />
In this example, I am loading a `FirebaseListObservable` via the AngularFire2 package. The actual data is just and array of items from a to-do list.  This code was originally created for the RealTime Database video, so check that out if you want to learn more about asynchronous data streams. <br />
<br />
Step 3 - Show and Hide the Spinner<br />
<br />
We want to show the spinner in the items-list component while data is being retried.<br />
<br />
First, we define a variable called `showSpinner` in the component and set it to true by default. During `ngOnInit`, the data is requested from the service as a `FirebaseListObservable`. We can determine if the data has been loaded by subscribing to it. The function inside the subscribe call will be executed after the observable emits data, so we can simply set `showSpinner` variable to false when this happens. <br />
<br />
In the template, we can use the `*ngIf` directive with the `showSpinner` variable to control the visibility spinner. <br />
<br />
Going back to the app, we can see that spinner is visible for a split second before the data is loaded. The longer it takes for your data the load, the more useful this spinner will be your end users. <br />
<br />
That's it for loading spinners, see you next time.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="151"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Loading Spinners for Asynchronous Firebase Data</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/d241fb52d-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;https://angularfirebase.com/lessons/show-loading-spinners-for-firebase-data/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In this episode, I will show you how to display and hide a loading spinner when retrieving asynchronous Firebase data from an Angular application. Loading indicators are an important UI feature because they show the end user when more data is incoming.  &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 1 - Create the Spinner component&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
We&apos;re going to create a SpinnerComponent that can be reused throughout the application. To make it look cool, I am using Spinkit CSS library, which we can just be copied directly into the component&apos;s CSS and HTML files. You do not need to change anything in the component&apos;s TypeScript. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 2 - Retrieve Aschronous Data&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
We need to load some data from Firebase to make use of the spinner.  &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In this example, I am loading a `FirebaseListObservable` via the AngularFire2 package. The actual data is just and array of items from a to-do list.  This code was originally created for the RealTime Database video, so check that out if you want to learn more about asynchronous data streams. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 3 - Show and Hide the Spinner&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
We want to show the spinner in the items-list component while data is being retried.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
First, we define a variable called `showSpinner` in the component and set it to true by default. During `ngOnInit`, the data is requested from the service as a `FirebaseListObservable`. We can determine if the data has been loaded by subscribing to it. The function inside the subscribe call will be executed after the observable emits data, so we can simply set `showSpinner` variable to false when this happens. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In the template, we can use the `*ngIf` directive with the `showSpinner` variable to control the visibility spinner. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Going back to the app, we can see that spinner is visible for a split second before the data is loaded. The longer it takes for your data the load, the more useful this spinner will be your end users. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
That&apos;s it for loading spinners, see you next time.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/d241fb52d-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=d241fb52d</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Sharing Data between Components in Angular</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=5d96ab357</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/5d96ab357-1.jpg"  /></p>Fully documented lesson at https://angularfirebase.com/lessons/sharing-data-between-angular-components-four-methods/<br />
<br />
In this episode, I am going to show you four different ways to share data between Angular components. <br />
<br />
Parent to Child the Input Decorator<br />
<br />
When you declare a variable with the Input decorator in the child component, it allows that variable to be received from a parent template. In this case, we define a message variable in the parent, then use square brackets to pass the data to the child. Now the child can display this data in its own template.<br />
<br />
Child to Parent via ViewChild<br />
<br />
ViewChild allows a one component to be injected into another, giving the parent access to its attributes and functions. One caveat, however, is that child won't be available until after the view has been initialized. This means we need to implement the AfterViewInit lifecycle hook to receive the data from the child.  <br />
<br />
In the AfterViewInit function we can access the message variable defined in the child<br />
<br />
Child to Parent via Output and EventEmitter<br />
<br />
Another way to share data is to emit data from the child, which can be listed to by the parent. This approach is ideal when you want to share data changes that occur on things like button clicks, form entires, and other user events. <br />
<br />
In the child, we declare a messageEvent variable with the Output decorator and set it equal to a new event emitter. Then we create a function named sendMessage that calls emit on this event with the message we want to send. Lastly, we create a button to trigger this function.<br />
<br />
In the parent, we create a function to receive the message and set it equal to the message variable. <br />
<br />
The parent can now subscribe to this messageEvent that's outputted by the child component, then run the receive message function whenever this event occurs. <br />
<br />
Share data between any components<br />
<br />
When passing data between components that lack a direct connection, such as siblings, grandchildren, etc, you should you a shared service. When you have data that should aways been in sync, I find the RxJS `BehaviorSubject` very useful in this situation. The main benefit that a BehaviorSubject ensures that every component consuming the service receives the most recent data. <br />
    <br />
<br />
In the service, we create a private BehaviorSubject that will hold the current value of the message. We define a currentMessage variable handle this data stream as an observable that will be used by the components. Lastly, we create function that calls next on the BehaviorSubject to change its value. <br />
<br />
The parent, child, and sibling components all receive the same treatment. We inject the DataService in the constructor, then subscribe to the currentMessage observable and set its value equal to the message variable. <br />
<br />
Now if we create a function in any one of these components that changes the value of the message. when this function is executed the new data it's automatically broadcast to all other components. <br />
<br />
That's it for data sharing. See you next time.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="319"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Sharing Data between Components in Angular</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/5d96ab357-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;Fully documented lesson at https://angularfirebase.com/lessons/sharing-data-between-angular-components-four-methods/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In this episode, I am going to show you four different ways to share data between Angular components. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Parent to Child the Input Decorator&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
When you declare a variable with the Input decorator in the child component, it allows that variable to be received from a parent template. In this case, we define a message variable in the parent, then use square brackets to pass the data to the child. Now the child can display this data in its own template.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Child to Parent via ViewChild&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
ViewChild allows a one component to be injected into another, giving the parent access to its attributes and functions. One caveat, however, is that child won&apos;t be available until after the view has been initialized. This means we need to implement the AfterViewInit lifecycle hook to receive the data from the child.  &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In the AfterViewInit function we can access the message variable defined in the child&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Child to Parent via Output and EventEmitter&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Another way to share data is to emit data from the child, which can be listed to by the parent. This approach is ideal when you want to share data changes that occur on things like button clicks, form entires, and other user events. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In the child, we declare a messageEvent variable with the Output decorator and set it equal to a new event emitter. Then we create a function named sendMessage that calls emit on this event with the message we want to send. Lastly, we create a button to trigger this function.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In the parent, we create a function to receive the message and set it equal to the message variable. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
The parent can now subscribe to this messageEvent that&apos;s outputted by the child component, then run the receive message function whenever this event occurs. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Share data between any components&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
When passing data between components that lack a direct connection, such as siblings, grandchildren, etc, you should you a shared service. When you have data that should aways been in sync, I find the RxJS `BehaviorSubject` very useful in this situation. The main benefit that a BehaviorSubject ensures that every component consuming the service receives the most recent data. &amp;lt;br /&amp;gt;
    &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In the service, we create a private BehaviorSubject that will hold the current value of the message. We define a currentMessage variable handle this data stream as an observable that will be used by the components. Lastly, we create function that calls next on the BehaviorSubject to change its value. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
The parent, child, and sibling components all receive the same treatment. We inject the DataService in the constructor, then subscribe to the currentMessage observable and set its value equal to the message variable. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Now if we create a function in any one of these components that changes the value of the message. when this function is executed the new data it&apos;s automatically broadcast to all other components. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
That&apos;s it for data sharing. See you next time.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/5d96ab357-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=5d96ab357</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>How to Deploy an Angular App to Firebase Hosting</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=b3be8dc5e</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/b3be8dc5e-1.jpg"  /></p>https://angularfirebase.com/lessons/deploying-an-angular-app-to-firebase/<br />
In this episode, we're going to deploy an Angular 4 app to Firebase hosting. After some initial configuration, you can deploy your app to firebase in a matter of seconds. The best part is that its free for low volume usage and you'll be prepared to scale up as your app grows.  <br />
<br />
Step 1 - Compile your App<br />
<br />
Running the ng build command will compile and minify your code in a single package in the dist/ folder. You could drop the contents of this directory into virtually any static website hosting platform or even an S3 bucket and you’re site would be ready to serve traffic.<br />
<br />
Step 2 - Install Firebase Tools<br />
<br />
Firebase has a nice command line package for deployment. Install it with NPM, then log into your firebase account. <br />
<br />
Step 3 - Initialize your Project<br />
<br />
Make sure you are in the top level directory of your angular app, then run firebase init. This will take you through a one-time configuration for your app. <br />
<br />
For the most part, you can stick with the default settings, except in the follow cases:<br />
<br />
Choose hosting on the first question.<br />
Change public folder to dist when asked (it defaults to public).<br />
Configure as single page app? Yes<br />
If firebase asks to overwrite your index.html file, respond with NO.<br />
<br />
Step 4 - Deploy<br />
<br />
Now your app should be ready to deploy. Run the firebase deploy command, then check your project URL to make sure everything looks good. <br />
<br />
That's all for firebase deployment, see you next time.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="115"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>How to Deploy an Angular App to Firebase Hosting</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/b3be8dc5e-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;https://angularfirebase.com/lessons/deploying-an-angular-app-to-firebase/&amp;lt;br /&amp;gt;
In this episode, we&apos;re going to deploy an Angular 4 app to Firebase hosting. After some initial configuration, you can deploy your app to firebase in a matter of seconds. The best part is that its free for low volume usage and you&apos;ll be prepared to scale up as your app grows.  &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 1 - Compile your App&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Running the ng build command will compile and minify your code in a single package in the dist/ folder. You could drop the contents of this directory into virtually any static website hosting platform or even an S3 bucket and you’re site would be ready to serve traffic.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 2 - Install Firebase Tools&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Firebase has a nice command line package for deployment. Install it with NPM, then log into your firebase account. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 3 - Initialize your Project&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Make sure you are in the top level directory of your angular app, then run firebase init. This will take you through a one-time configuration for your app. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
For the most part, you can stick with the default settings, except in the follow cases:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Choose hosting on the first question.&amp;lt;br /&amp;gt;
Change public folder to dist when asked (it defaults to public).&amp;lt;br /&amp;gt;
Configure as single page app? Yes&amp;lt;br /&amp;gt;
If firebase asks to overwrite your index.html file, respond with NO.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 4 - Deploy&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Now your app should be ready to deploy. Run the firebase deploy command, then check your project URL to make sure everything looks good. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
That&apos;s all for firebase deployment, see you next time.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/b3be8dc5e-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=b3be8dc5e</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Upload Files from Angular to Firebase Storage</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=ae5fb144b</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/ae5fb144b-1.jpg"  /></p>UPDATE Watch the latest store video here: https://youtu.be/wRWZQwiNFnM<br />
<br />
Full Lesson: https://angularfirebase.com/lessons/angular-file-uploads-to-firebase-storage/<br />
<br />
In this episode we are going to implement file uploads with Angular and Firebase Storage. File storage is currently unsupported in the AngularFire2 package, but it's still possible to use Firebase storage by interacting directly with the Firebase Web API. We're still going use AngularFire2 for saving information about file uploads to the realtime database, such as the file name and its URL location. <br />
<br />
Step 1 - Generate the Files<br />
<br />
The structure of this feature is very similar to the Angular Firebase CRUD lesson, so make sure to check that out. It is just  form that accepts files, uploads them to the storage bucket, then renders the details to a list. <br />
<br />
ng g service uploads/shared/upload<br />
ng g class uploads/shared/upload<br />
ng g component uploads/uploads-list<br />
ng g component uploads/upload-detail<br />
ng g component uploads/upload-form<br />
<br />
Step 2 - Define the Upload Class<br />
<br />
The upload class will be used by the service. Notice it has a constructor for the `file` attribute, which has a type of `File`. This class is built into JavaScript and it defines files that are passed via HTML from inputs. <br />
<br />
Step 3 - Build the Upload Service<br />
<br />
The service needs to upload the file to Firebase Storage then save details about the file to the realtime database. First let's add the necessary imports import, including the Firebase API, and declare the variables. <br />
<br />
Here's the push upload function works step-by-step. <br />
<br />
1. First, Establish a reference to the firebase storage bucket. <br />
2. Second, define the `uploadTask` as a promise to put the file in storage. <br />
3. Third, monitor the uploadTask event using the `.on` function. <br />
4. Last, handle the events of in progress, success, and error.<br />
<br />
When the upload is in progress we will take a snapshot to get the number of bytes transferred. Using some simple math, we convert it to a percentage to display a progress bar for the user. <br />
<br />
When the upload is complete, we update the database.<br />
<br />
Before moving to the components, we need a way to delete files. Deleting a file only requires a reference to its location. Because we saved the name of the file to the database, we can use it to locate the file in storage and delete it. Here's the code to delete files from both firebase storage and the realtime  database. <br />
<br />
Step 4 - Build the Upload Form Component<br />
<br />
Now we need to give users a way to choose files and upload or delete them. Let’s start with the UploadFormComponent because that is where most of the action is happening. <br />
<br />
When a user selects files in an HTML file input, it fires the change event. Our template will listen the change event, then pass the event to our component, which contains the list of files the user is trying to upload. <br />
<br />
Now we can create methods to trigger the upload function from the service. I created separate functions for handling single files and multiple files that will be connected to buttons in the template. <br />
<br />
For the end user, we have a progress bar that changes its width based on the snapshot from the upload service. <br />
<br />
To trigger the upload, we use a regular HTML input that fires the `detectFiles` whenever a new file is entered. This will define the "selectedFiles" variable. Then the user can click Upload files to push the file to storage. <br />
<br />
That's it firebase file uploads, see you next time. <br />
Step 1 - Compile your App<br />
<br />
Running the ng build command will compile and minify your code in a single package in the dist/ folder. You could drop the contents of this directory into virtually any static website hosting platform or even an S3 bucket and you’re site would be ready to serve traffic.<br />
<br />
Step 2 - Install Firebase Tools<br />
<br />
Firebase has a nice command line package for deployment. Install it with NPM, then log into your firebase account. <br />
<br />
Step 3 - Initialize your Project<br />
<br />
Make sure you are in the top level directory of your angular app, then run firebase init. This will take you through a one-time configuration for your app. <br />
<br />
For the most part, you can stick with the default settings, except in the follow cases:<br />
<br />
Choose hosting on the first question.<br />
Change public folder to dist when asked (it defaults to public).<br />
Configure as single page app? Yes<br />
If firebase asks to overwrite your index.html file, respond with NO.<br />
<br />
Step 4 - Deploy<br />
<br />
Now your app should be ready to deploy. Run the firebase deploy command, then check your project URL to make sure everything looks good. <br />
<br />
That's all for firebase deployment, see you next time.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="242"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Upload Files from Angular to Firebase Storage</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/ae5fb144b-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;UPDATE Watch the latest store video here: https://youtu.be/wRWZQwiNFnM&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Full Lesson: https://angularfirebase.com/lessons/angular-file-uploads-to-firebase-storage/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In this episode we are going to implement file uploads with Angular and Firebase Storage. File storage is currently unsupported in the AngularFire2 package, but it&apos;s still possible to use Firebase storage by interacting directly with the Firebase Web API. We&apos;re still going use AngularFire2 for saving information about file uploads to the realtime database, such as the file name and its URL location. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 1 - Generate the Files&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
The structure of this feature is very similar to the Angular Firebase CRUD lesson, so make sure to check that out. It is just  form that accepts files, uploads them to the storage bucket, then renders the details to a list. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
ng g service uploads/shared/upload&amp;lt;br /&amp;gt;
ng g class uploads/shared/upload&amp;lt;br /&amp;gt;
ng g component uploads/uploads-list&amp;lt;br /&amp;gt;
ng g component uploads/upload-detail&amp;lt;br /&amp;gt;
ng g component uploads/upload-form&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 2 - Define the Upload Class&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
The upload class will be used by the service. Notice it has a constructor for the `file` attribute, which has a type of `File`. This class is built into JavaScript and it defines files that are passed via HTML from inputs. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 3 - Build the Upload Service&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
The service needs to upload the file to Firebase Storage then save details about the file to the realtime database. First let&apos;s add the necessary imports import, including the Firebase API, and declare the variables. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Here&apos;s the push upload function works step-by-step. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
1. First, Establish a reference to the firebase storage bucket. &amp;lt;br /&amp;gt;
2. Second, define the `uploadTask` as a promise to put the file in storage. &amp;lt;br /&amp;gt;
3. Third, monitor the uploadTask event using the `.on` function. &amp;lt;br /&amp;gt;
4. Last, handle the events of in progress, success, and error.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
When the upload is in progress we will take a snapshot to get the number of bytes transferred. Using some simple math, we convert it to a percentage to display a progress bar for the user. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
When the upload is complete, we update the database.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Before moving to the components, we need a way to delete files. Deleting a file only requires a reference to its location. Because we saved the name of the file to the database, we can use it to locate the file in storage and delete it. Here&apos;s the code to delete files from both firebase storage and the realtime  database. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 4 - Build the Upload Form Component&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Now we need to give users a way to choose files and upload or delete them. Let’s start with the UploadFormComponent because that is where most of the action is happening. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
When a user selects files in an HTML file input, it fires the change event. Our template will listen the change event, then pass the event to our component, which contains the list of files the user is trying to upload. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Now we can create methods to trigger the upload function from the service. I created separate functions for handling single files and multiple files that will be connected to buttons in the template. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
For the end user, we have a progress bar that changes its width based on the snapshot from the upload service. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
To trigger the upload, we use a regular HTML input that fires the `detectFiles` whenever a new file is entered. This will define the &quot;selectedFiles&quot; variable. Then the user can click Upload files to push the file to storage. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
That&apos;s it firebase file uploads, see you next time. &amp;lt;br /&amp;gt;
Step 1 - Compile your App&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Running the ng build command will compile and minify your code in a single package in the dist/ folder. You could drop the contents of this directory into virtually any static website hosting platform or even an S3 bucket and you’re site would be ready to serve traffic.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 2 - Install Firebase Tools&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Firebase has a nice command line package for deployment. Install it with NPM, then log into your firebase account. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 3 - Initialize your Project&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Make sure you are in the top level directory of your angular app, then run firebase init. This will take you through a one-time configuration for your app. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
For the most part, you can stick with the default settings, except in the follow cases:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Choose hosting on the first question.&amp;lt;br /&amp;gt;
Change public folder to dist when asked (it defaults to public).&amp;lt;br /&amp;gt;
Configure as single page app? Yes&amp;lt;br /&amp;gt;
If firebase asks to overwrite your index.html file, respond with NO.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 4 - Deploy&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Now your app should be ready to deploy. Run the firebase deploy command, then check your project URL to make sure everything looks good. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
That&apos;s all for firebase deployment, see you next time.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/ae5fb144b-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=ae5fb144b</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Angular Firebase CRUD App with NoSQL Database Tutorial</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=3cbbcaa3a</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/3cbbcaa3a-1.jpg"  /></p>Update Oct 2017: Learn about important changes with Firestore and AngularFire v5 https://youtu.be/-GjF9pSeFTs<br />
<br />
https://angularfirebase.com/lessons/reactive-crud-app-with-angular-and-firebase-tutorial/<br />
In this episode we're going to build todo list feature that performs the SQL-style CRUD operations of create, read, update, and delete. NoSQL use different terms for these operations, so heres a basic translation when working with Firebase. <br />
<br />
create -- push<br />
read -- list or object<br />
update -- update or set<br />
delete -- remove<br />
<br />
Angular apps work with asynchronous data streams using RxJS reactive extensions for JavaScript. A data stream can be anything, but in this context we are talking about objects from the Firebase realtime database.<br />
<br />
At this point, it is assumed you have the AngularFire2 package installed and bootstrapped into your app. If not, go to the docs or checkout this video. <br />
<br />
Step 1 - Generate the Files<br />
<br />
Start by generating the necessary files from the command line. The feature is a simple list of todo items that can be modified by users. <br />
<br />
ng g service items/shared/item<br />
ng g class items/shared/item<br />
ng g component items/items-list<br />
ng g component items/item-detail<br />
ng g component items/item-form<br />
<br />
Step 2 - Define an Item Class<br />
<br />
We will give Items their own TypeScript class to keep our data organized. <br />
<br />
Step 3 - Building the Service<br />
<br />
All the CRUD magic happens in the service, which performs six different operations. <br />
<br />
1. Get a list of items<br />
2. Get a single item<br />
3. Create a new item<br />
4. Update an existing item<br />
5. Delete a single item<br />
6. Delete an entire list of items<br />
<br />
Let's start by importing dependencies and declaring public variables. <br />
<br />
When we get an item or list of items, they will returned as an observable, which can then be unwrapped asynchronously in a component. The functions for getting an item or list will return the observable so it can be set as a public variable. <br />
<br />
All other functions will return void because they operate on the items variable or take a specific key as an argument. Any component watching the items variable will be automatically updated when these functions are called.<br />
<br />
All of these operations are defined in the AngularFire2 docs, so I recommend you check those out. <br />
<br />
Step 4 - Build the List Component<br />
<br />
The list component will serve as a parent component that iterates over items in the database. First, we need to define a public items variable during the NgOnInit lifecycle hook. This variable holds the Firebase List observable. <br />
<br />
Then we use the ngFor directive with the async pipe to iterate over the observable. The async pipe is critical because the observable will be empty on initial rendering, so we need to tell angular to handle it differently than a regular JavaScript object. <br />
<br />
Step 5 - Build the Item Detail Component<br />
<br />
In the item detail component, we use the `@Input` decorator to pass data from the parent to the child via the template. We also crate a few functions that can be trigged by clicking buttons to operate on a single items within the list. <br />
<br />
In the template itself, we display the item attributes and add the CRUD functions to the cooresponding buttons.   <br />
<br />
Step 6 - Build the Item Form Component<br />
<br />
There are several different form validation methods in Angular. In this example, I am going to use a template driven approach using the if-then-else else syntax introduced in Angular 4. This method is only ideal for small simple forms because all the logic will be defined in the HTML. <br />
<br />
We define two different templates named valid and errors. We can then display these templates conditionally based on the form state. <br />
<br />
The final step is to submit the form to create a new item. In this case, I just use the click event to trigger the `createItem` method from the service. <br />
<br />
That's all for Firebase CRUD, see you next time.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="261"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Angular Firebase CRUD App with NoSQL Database Tutorial</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/3cbbcaa3a-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;Update Oct 2017: Learn about important changes with Firestore and AngularFire v5 https://youtu.be/-GjF9pSeFTs&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
https://angularfirebase.com/lessons/reactive-crud-app-with-angular-and-firebase-tutorial/&amp;lt;br /&amp;gt;
In this episode we&apos;re going to build todo list feature that performs the SQL-style CRUD operations of create, read, update, and delete. NoSQL use different terms for these operations, so heres a basic translation when working with Firebase. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
create -- push&amp;lt;br /&amp;gt;
read -- list or object&amp;lt;br /&amp;gt;
update -- update or set&amp;lt;br /&amp;gt;
delete -- remove&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Angular apps work with asynchronous data streams using RxJS reactive extensions for JavaScript. A data stream can be anything, but in this context we are talking about objects from the Firebase realtime database.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
At this point, it is assumed you have the AngularFire2 package installed and bootstrapped into your app. If not, go to the docs or checkout this video. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 1 - Generate the Files&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Start by generating the necessary files from the command line. The feature is a simple list of todo items that can be modified by users. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
ng g service items/shared/item&amp;lt;br /&amp;gt;
ng g class items/shared/item&amp;lt;br /&amp;gt;
ng g component items/items-list&amp;lt;br /&amp;gt;
ng g component items/item-detail&amp;lt;br /&amp;gt;
ng g component items/item-form&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 2 - Define an Item Class&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
We will give Items their own TypeScript class to keep our data organized. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 3 - Building the Service&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
All the CRUD magic happens in the service, which performs six different operations. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
1. Get a list of items&amp;lt;br /&amp;gt;
2. Get a single item&amp;lt;br /&amp;gt;
3. Create a new item&amp;lt;br /&amp;gt;
4. Update an existing item&amp;lt;br /&amp;gt;
5. Delete a single item&amp;lt;br /&amp;gt;
6. Delete an entire list of items&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Let&apos;s start by importing dependencies and declaring public variables. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
When we get an item or list of items, they will returned as an observable, which can then be unwrapped asynchronously in a component. The functions for getting an item or list will return the observable so it can be set as a public variable. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
All other functions will return void because they operate on the items variable or take a specific key as an argument. Any component watching the items variable will be automatically updated when these functions are called.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
All of these operations are defined in the AngularFire2 docs, so I recommend you check those out. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 4 - Build the List Component&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
The list component will serve as a parent component that iterates over items in the database. First, we need to define a public items variable during the NgOnInit lifecycle hook. This variable holds the Firebase List observable. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Then we use the ngFor directive with the async pipe to iterate over the observable. The async pipe is critical because the observable will be empty on initial rendering, so we need to tell angular to handle it differently than a regular JavaScript object. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 5 - Build the Item Detail Component&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In the item detail component, we use the `@Input` decorator to pass data from the parent to the child via the template. We also crate a few functions that can be trigged by clicking buttons to operate on a single items within the list. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In the template itself, we display the item attributes and add the CRUD functions to the cooresponding buttons.   &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 6 - Build the Item Form Component&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
There are several different form validation methods in Angular. In this example, I am going to use a template driven approach using the if-then-else else syntax introduced in Angular 4. This method is only ideal for small simple forms because all the logic will be defined in the HTML. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
We define two different templates named valid and errors. We can then display these templates conditionally based on the form state. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
The final step is to submit the form to create a new item. In this case, I just use the click event to trigger the `createItem` method from the service. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
That&apos;s all for Firebase CRUD, see you next time.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/3cbbcaa3a-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=3cbbcaa3a</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Angular Router Guards for Firebase Users</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=c958c37ff</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/c958c37ff-1.jpg"  /></p>UPDATE: Get the latest version here https://angularfirebase.com/lessons/google-user-auth-with-firestore-custom-data/<br />
<br />
Router Guards are used in Angular to prevent unauthorized users from navigating anywhere they want in your app. At this point our app has a working Firebase authentication system, but any visitor can access routes intended for only logged in users. <br />
<br />
Guards handle this problem by implementing the CanActivate interface, which tells Angular whether or not to activate a route. In this example, we will protect pages for unauthenticated users and redirect them to a signin page. <br />
<br />
Step 1 - Generate the Guard<br />
<br />
We use the CLI in Angular 4 to generate a default guard. <br />
<br />
Guards use the injectable decorator, so they need to be registered as a provider just like any other service in the app module. <br />
<br />
Step 2 - Update the Auth Service<br />
<br />
Our users are authenticating via Firebase and the AngularFire2 package. In the service we are subscribing the FirebaseAuthState, then using a getter to see if the auth object is null. Checkout the OAuth tutorial for more details on this code. <br />
<br />
Step 3 - Implement the Guard Logic<br />
<br />
Router guards always return a boolean type or boolean observable. The logic here is simple, if the FirebaseAuthState is defined, we activate the route. Otherwise, we return false and navigate to to the login page. <br />
<br />
Now that the guard is complete, we just need to apply it to specific routes in the routing module. <br />
<br />
That's it for router guards, I'll see you next time.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="104"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Angular Router Guards for Firebase Users</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/c958c37ff-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;UPDATE: Get the latest version here https://angularfirebase.com/lessons/google-user-auth-with-firestore-custom-data/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Router Guards are used in Angular to prevent unauthorized users from navigating anywhere they want in your app. At this point our app has a working Firebase authentication system, but any visitor can access routes intended for only logged in users. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Guards handle this problem by implementing the CanActivate interface, which tells Angular whether or not to activate a route. In this example, we will protect pages for unauthenticated users and redirect them to a signin page. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 1 - Generate the Guard&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
We use the CLI in Angular 4 to generate a default guard. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Guards use the injectable decorator, so they need to be registered as a provider just like any other service in the app module. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 2 - Update the Auth Service&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Our users are authenticating via Firebase and the AngularFire2 package. In the service we are subscribing the FirebaseAuthState, then using a getter to see if the auth object is null. Checkout the OAuth tutorial for more details on this code. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 3 - Implement the Guard Logic&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Router guards always return a boolean type or boolean observable. The logic here is simple, if the FirebaseAuthState is defined, we activate the route. Otherwise, we return false and navigate to to the login page. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Now that the guard is complete, we just need to apply it to specific routes in the routing module. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
That&apos;s it for router guards, I&apos;ll see you next time.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/c958c37ff-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=c958c37ff</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Anonymous Authentication with Angular and Firebase - Lazy Registration</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=3112834d3</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/3112834d3-1.jpg"  /></p>https://angularfirebase.com/lessons/angular-firebase-authentication-tutorial-anonymous-auth/ In this episode were going to build an Anonymous Authorization service with Angular 4 and Firebase. This feature will allow a user to start using your app with going through the typical OAuth signin or Email Password registration process. This approach is also called lazy registration or gradual engagement. <br />
<br />
It works by creating a session using only a user ID (UID). If the user signs out without updating more account details, they will be unable to log back in.<br />
<br />
At this point, it is assumed you have the AngularFire2 package installed and bootstrapped into your app. If not, go to the docs or checkout this video. <br />
<br />
STEP 1 - Generate the Auth Service<br />
<br />
If starting from scratch, generate the Auth Service. I'm going to be building upon the auth service from my previous OAuth tutorial and I recommend checking that video out first.<br />
<br />
STEP 2 - Activate Providers in Firebase<br />
<br />
Head over to your firebase project and enable the anonymous provider.<br />
<br />
STEP 3 - Building the Service<br />
<br />
First, make sure to subscribe to the FirebaseAuthState in the constructor. <br />
<br />
Then, write a function to login the user with the Anonymous provider. <br />
<br />
Let's also add a TypeScript getter to  see if a logged in user is anonymous. This will be useful when displaying content specifically for anonymous users. <br />
<br />
STEP 4 - Create a Component<br />
<br />
Now we can inject the service into our components to login users anonymously. In this case, we just bind the function to the click event of a button.  <br />
<br />
STEP 5 - Upgrading the Account<br />
<br />
When an anonymous user decides to upgrade, you will need to transfer the account data. The Firebase web API can do this, but you would need to bypass the AngularFire2 package. As an alternative,you can create a new account, then transfer the User's data to it. Assuming your data is nested under a User ID, here's how you could map it to a new account. <br />
<br />
This function works by taking a snapshot of the data nested under anonymous ID, then copies it to the new account after the User logs in with google. <br />
<br />
That's it for Anonymous Auth. Check out the full article for more details and I'll see you next time.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="160"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Anonymous Authentication with Angular and Firebase - Lazy Registration</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/3112834d3-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;https://angularfirebase.com/lessons/angular-firebase-authentication-tutorial-anonymous-auth/ In this episode were going to build an Anonymous Authorization service with Angular 4 and Firebase. This feature will allow a user to start using your app with going through the typical OAuth signin or Email Password registration process. This approach is also called lazy registration or gradual engagement. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
It works by creating a session using only a user ID (UID). If the user signs out without updating more account details, they will be unable to log back in.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
At this point, it is assumed you have the AngularFire2 package installed and bootstrapped into your app. If not, go to the docs or checkout this video. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
STEP 1 - Generate the Auth Service&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
If starting from scratch, generate the Auth Service. I&apos;m going to be building upon the auth service from my previous OAuth tutorial and I recommend checking that video out first.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
STEP 2 - Activate Providers in Firebase&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Head over to your firebase project and enable the anonymous provider.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
STEP 3 - Building the Service&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
First, make sure to subscribe to the FirebaseAuthState in the constructor. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Then, write a function to login the user with the Anonymous provider. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Let&apos;s also add a TypeScript getter to  see if a logged in user is anonymous. This will be useful when displaying content specifically for anonymous users. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
STEP 4 - Create a Component&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Now we can inject the service into our components to login users anonymously. In this case, we just bind the function to the click event of a button.  &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
STEP 5 - Upgrading the Account&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
When an anonymous user decides to upgrade, you will need to transfer the account data. The Firebase web API can do this, but you would need to bypass the AngularFire2 package. As an alternative,you can create a new account, then transfer the User&apos;s data to it. Assuming your data is nested under a User ID, here&apos;s how you could map it to a new account. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
This function works by taking a snapshot of the data nested under anonymous ID, then copies it to the new account after the User logs in with google. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
That&apos;s it for Anonymous Auth. Check out the full article for more details and I&apos;ll see you next time.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/3112834d3-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=3112834d3</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>OAuth with Angular and Firebase Tutorial</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=223d042c9</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/223d042c9-1.jpg"  /></p>UPDATE Oct 10th, 2017: Fully updated tutorial for AngularFire v5 and Firestore https://youtu.be/e8GA1UOj8mE <br />
<br />
<br />
Angular OAuth with Firebase <br />
Tutorial https://angularfirebase.com/lessons/angular-firebase-authentication-tutorial-oauth/<br />
<br />
In this episode, were going to build a user authentication system with Angular 4 and Firebase. Authentication is required in almost every Angular application, including this basic todo list app. The app currently has no authentication at all, but we want user to be able to log in with their Google, Facebook, Twitter, or Github account. <br />
<br />
At this point, it is assumed you have the AngularFire2 package installed and bootstrapped into your app. If not, go to the docs or checkout this video. <br />
<br />
STEP 1 - Generate Files<br />
<br />
We are going to keep this feature super simple. <br />
<br />
The Auth Service will handle interaction with the Firebase API. <br />
The User Login Component will handle the login and logout buttons. <br />
The User Profile Component will show details about the User. <br />
<br />
<br />
STEP 2 - Activate Providers in Firebase<br />
<br />
Head over to your firebase project and enable the providers you want. For non-google providers, you will need to get your own developer account and API keys. <br />
<br />
STEP 3 - Build the Service<br />
<br />
The way you handle authentication with Firebase is by subscribing to the AngularFire-Auth observable which returns a Firebase-Auth-State object. <br />
<br />
Now that we have the AuthState object, we can take advantage of TypeScript accessors to get attributes. In this case, I'm interested in the User ID. <br />
<br />
Here's the beauty of firebase - you can implement 4 social auth providers with very little code. I start by creating a reusable  private function that takes the provider as an argument named `Social-Sign-In`.<br />
<br />
When a user attempts to sign in two things can happen - success or failure. If it's a success, the `then` code will execute, if its's an error the `catch` code will execute. <br />
<br />
You may be wondering what the `updateUserData` function is about.  It's optional, but you may want to save user records to the Firebase realtime database. It can be useful if you plan on iterating over users in your app or if you collect additional data during signup. <br />
<br />
We finish off the service by creating an action for each of the four providers. This is as simple as returning the result of the `socialSignIn` function.<br />
<br />
STEP 4 - Frontend Components<br />
<br />
With the auth service complete, we can inject it into components. Here's how you might create a Login Component with functions to login with each provider handleError<br />
<br />
In the template we can then bind these functions to the click event. <br />
<br />
The accessors we created in the service come in handy in for adding conditional logic to the template.  <br />
<br />
That wraps it up. Check out the full Firebase OAuth article more detail on code and I'll you next time.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="198"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>OAuth with Angular and Firebase Tutorial</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/223d042c9-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;UPDATE Oct 10th, 2017: Fully updated tutorial for AngularFire v5 and Firestore https://youtu.be/e8GA1UOj8mE &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Angular OAuth with Firebase &amp;lt;br /&amp;gt;
Tutorial https://angularfirebase.com/lessons/angular-firebase-authentication-tutorial-oauth/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In this episode, were going to build a user authentication system with Angular 4 and Firebase. Authentication is required in almost every Angular application, including this basic todo list app. The app currently has no authentication at all, but we want user to be able to log in with their Google, Facebook, Twitter, or Github account. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
At this point, it is assumed you have the AngularFire2 package installed and bootstrapped into your app. If not, go to the docs or checkout this video. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
STEP 1 - Generate Files&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
We are going to keep this feature super simple. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
The Auth Service will handle interaction with the Firebase API. &amp;lt;br /&amp;gt;
The User Login Component will handle the login and logout buttons. &amp;lt;br /&amp;gt;
The User Profile Component will show details about the User. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
STEP 2 - Activate Providers in Firebase&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Head over to your firebase project and enable the providers you want. For non-google providers, you will need to get your own developer account and API keys. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
STEP 3 - Build the Service&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
The way you handle authentication with Firebase is by subscribing to the AngularFire-Auth observable which returns a Firebase-Auth-State object. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Now that we have the AuthState object, we can take advantage of TypeScript accessors to get attributes. In this case, I&apos;m interested in the User ID. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Here&apos;s the beauty of firebase - you can implement 4 social auth providers with very little code. I start by creating a reusable  private function that takes the provider as an argument named `Social-Sign-In`.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
When a user attempts to sign in two things can happen - success or failure. If it&apos;s a success, the `then` code will execute, if its&apos;s an error the `catch` code will execute. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
You may be wondering what the `updateUserData` function is about.  It&apos;s optional, but you may want to save user records to the Firebase realtime database. It can be useful if you plan on iterating over users in your app or if you collect additional data during signup. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
We finish off the service by creating an action for each of the four providers. This is as simple as returning the result of the `socialSignIn` function.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
STEP 4 - Frontend Components&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
With the auth service complete, we can inject it into components. Here&apos;s how you might create a Login Component with functions to login with each provider handleError&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
In the template we can then bind these functions to the click event. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
The accessors we created in the service come in handy in for adding conditional logic to the template.  &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
That wraps it up. Check out the full Firebase OAuth article more detail on code and I&apos;ll you next time.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/223d042c9-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=223d042c9</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Angular 4 Development and Production Environments with Firebase</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=557b96de4</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/557b96de4-1.jpg"  /></p>Welcome to Angular Firebase. Today, I'm going to show you how to create separate backend environments for development and production with Angular 4. Maintaining separate environments allows you to build and test new features without screwing up data from your live production app. <br />
<br />
Step 1 - Create two Firebase Projects<br />
<br />
Before jumping into the code, you will need two separate Firebase projects one for development and one for production. <br />
<br />
Step 2 Create the Environment Files<br />
<br />
I just cloned the FireStarter App from github and the first step is to create the environment files. If you created a new app with the Angular CLI, these files will be here by default. Also, make sure to add these files to your gitignore as they will hold sensitive credentials for your app. <br />
<br />
Step 3  paste in the firebase config using the unique API credentials from each of your projects. <br />
<br />
Step 4 - Bootstrap the environment in the app module<br />
<br />
Now we can import the environment anywhere in our app. In this case, we want to bootstrap firebase config in the app module. These are the necessary lines to wire up the environments with Firebase. <br />
<br />
Step 5 - Serve or Build the App<br />
<br />
With that done, its possible to serve our app locally using either environment. It will serve in development by default with<br />
<br />
ng serve<br />
<br />
or serve in product with the --prod flag<br />
<br />
ng serve --prod<br />
<br />
When deploying the app, make sure to always include the --prod flag. <br />
<br />
ng build --prod<br />
<br />
Thanks for watching. I'll see you on the other side.]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:46 +0000</pubDate>
   <media:content medium="video" duration="110"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Angular 4 Development and Production Environments with Firebase</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/557b96de4-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;Welcome to Angular Firebase. Today, I&apos;m going to show you how to create separate backend environments for development and production with Angular 4. Maintaining separate environments allows you to build and test new features without screwing up data from your live production app. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 1 - Create two Firebase Projects&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Before jumping into the code, you will need two separate Firebase projects one for development and one for production. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 2 Create the Environment Files&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
I just cloned the FireStarter App from github and the first step is to create the environment files. If you created a new app with the Angular CLI, these files will be here by default. Also, make sure to add these files to your gitignore as they will hold sensitive credentials for your app. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 3  paste in the firebase config using the unique API credentials from each of your projects. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 4 - Bootstrap the environment in the app module&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Now we can import the environment anywhere in our app. In this case, we want to bootstrap firebase config in the app module. These are the necessary lines to wire up the environments with Firebase. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Step 5 - Serve or Build the App&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
With that done, its possible to serve our app locally using either environment. It will serve in development by default with&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
ng serve&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
or serve in product with the --prod flag&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
ng serve --prod&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
When deploying the app, make sure to always include the --prod flag. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
ng build --prod&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Thanks for watching. I&apos;ll see you on the other side.]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/557b96de4-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=557b96de4</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>NgRx + Firestore</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=9d37dd229</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/9d37dd229-1.jpg"  /></p>Learn how to use Firestore as a backend for NgRx. This episode combines the power @ngrx/entity with AngularFire2 State Changes for fine-grained control over your data. https://angularfirebase.com/lessons/state-changes-angularfire2-with-ngrx/<br />
<br />
Angular Air #135: https://youtu.be/t-auGKG1yjs<br />
NgRx: https://github.com/ngrx/platform<br />
Firestore: https://cloud.google.com/firestore/docs/<br />
Inspiration: https://www.booth.fi/]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:35 +0000</pubDate>
   <media:content medium="video" duration="620"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>NgRx + Firestore</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/9d37dd229-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;Learn how to use Firestore as a backend for NgRx. This episode combines the power @ngrx/entity with AngularFire2 State Changes for fine-grained control over your data. https://angularfirebase.com/lessons/state-changes-angularfire2-with-ngrx/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Angular Air #135: https://youtu.be/t-auGKG1yjs&amp;lt;br /&amp;gt;
NgRx: https://github.com/ngrx/platform&amp;lt;br /&amp;gt;
Firestore: https://cloud.google.com/firestore/docs/&amp;lt;br /&amp;gt;
Inspiration: https://www.booth.fi/]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/9d37dd229-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=9d37dd229</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Multi-Step Password Auth with Firebase and Reactive Forms</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=55d32c2f7</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/55d32c2f7-1.jpg"  /></p>Learn how to collect custom data from users in multiple steps with Firebase email password auth https://angularfirebase.com/lessons/multi-step-signup-firebase-email-password-auth-angular-reactive-forms/<br />
<br />
- Firebase Auth: https://firebase.google.com/docs/auth/web/password-auth<br />
- Angular 5: https://angular.io/guide/reactive-forms]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:35 +0000</pubDate>
   <media:content medium="video" duration="682"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Multi-Step Password Auth with Firebase and Reactive Forms</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/55d32c2f7-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;Learn how to collect custom data from users in multiple steps with Firebase email password auth https://angularfirebase.com/lessons/multi-step-signup-firebase-email-password-auth-angular-reactive-forms/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
- Firebase Auth: https://firebase.google.com/docs/auth/web/password-auth&amp;lt;br /&amp;gt;
- Angular 5: https://angular.io/guide/reactive-forms]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/55d32c2f7-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=55d32c2f7</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Angular SEO with Rendertron</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=bbc0b4cae</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/bbc0b4cae-1.jpg"  /></p>Today I bring you an elegant search engine optimization solution for Angular progressive web apps.  https://angularfirebase.com/lessons/seo-angular-part-1-rendertron-meta-tags/<br />
<br />
Live demo: https://instafire-app.firebaseapp.com<br />
<br />
1. This solution is fully compatible with AngularFire2 <br />
2. Will render links in twitter, facebook, etc.<br />
3.  Is crawlable by googlebot, bingbot, etc. <br />
4. Does not require Angular Universal or any weird hacks<br />
<br />
Rendertron: https://github.com/GoogleChrome/rendertron<br />
Cloud Functions: https://firebase.google.com/docs/functions/<br />
Inspiration: https://medium.com/dev-channel/solving-seo-with-headless-chrome-for-your-client-side-framework-288e66fdd2b7]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:35 +0000</pubDate>
   <media:content medium="video" duration="827"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Angular SEO with Rendertron</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/bbc0b4cae-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;Today I bring you an elegant search engine optimization solution for Angular progressive web apps.  https://angularfirebase.com/lessons/seo-angular-part-1-rendertron-meta-tags/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Live demo: https://instafire-app.firebaseapp.com&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
1. This solution is fully compatible with AngularFire2 &amp;lt;br /&amp;gt;
2. Will render links in twitter, facebook, etc.&amp;lt;br /&amp;gt;
3.  Is crawlable by googlebot, bingbot, etc. &amp;lt;br /&amp;gt;
4. Does not require Angular Universal or any weird hacks&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Rendertron: https://github.com/GoogleChrome/rendertron&amp;lt;br /&amp;gt;
Cloud Functions: https://firebase.google.com/docs/functions/&amp;lt;br /&amp;gt;
Inspiration: https://medium.com/dev-channel/solving-seo-with-headless-chrome-for-your-client-side-framework-288e66fdd2b7]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/bbc0b4cae-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=bbc0b4cae</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Contentful - CMS for Angular Progressive Web Apps</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=657f3c96b</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/657f3c96b-1.jpg"  /></p>Learn how to use Contentful as a CMS for Angular 5 Progressive Web Apps. In this episode, I show you how to use the platform, then write a Firebase Cloud Function that will broadcast push notifications when new content is published. https://angularfirebase.com/lessons/contentful-cms-progressive-web-apps/<br />
<br />
Frantic: https://www.frantic.com/<br />
Contentful: https://www.contentful.com/<br />
FCM: https://firebase.google.com/docs/cloud-messaging/]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:35 +0000</pubDate>
   <media:content medium="video" duration="637"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Contentful - CMS for Angular Progressive Web Apps</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/657f3c96b-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;Learn how to use Contentful as a CMS for Angular 5 Progressive Web Apps. In this episode, I show you how to use the platform, then write a Firebase Cloud Function that will broadcast push notifications when new content is published. https://angularfirebase.com/lessons/contentful-cms-progressive-web-apps/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Frantic: https://www.frantic.com/&amp;lt;br /&amp;gt;
Contentful: https://www.contentful.com/&amp;lt;br /&amp;gt;
FCM: https://firebase.google.com/docs/cloud-messaging/]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/657f3c96b-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=657f3c96b</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Faster Firestore via Data Aggregation</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=55aabb8b4</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/55aabb8b4-1.jpg"  /></p>Retrieve data from Firestore in a way that is faster and more cost effective with data aggregation. In this episode, we use Firebase Cloud Functions to read data from a sub-collection and write it to its parent document. https://angularfirebase.com/lessons/firestore-cloud-functions-data-aggregation/<br />
<br />
Firestore: https://firebase.google.com/docs/firestore/<br />
NoSQL Aggregation: https://www.thoughtworks.com/insights/blog/nosql-databases-overview]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:35 +0000</pubDate>
   <media:content medium="video" duration="568"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Faster Firestore via Data Aggregation</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/55aabb8b4-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;Retrieve data from Firestore in a way that is faster and more cost effective with data aggregation. In this episode, we use Firebase Cloud Functions to read data from a sub-collection and write it to its parent document. https://angularfirebase.com/lessons/firestore-cloud-functions-data-aggregation/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Firestore: https://firebase.google.com/docs/firestore/&amp;lt;br /&amp;gt;
NoSQL Aggregation: https://www.thoughtworks.com/insights/blog/nosql-databases-overview]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/55aabb8b4-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=55aabb8b4</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Infinite Scroll Pagination with Firestore</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=e84701454</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/e84701454-1.jpg"  /></p>Use Angular and Firestore to add infinite scroll pagination to your app from scratch - both downward and upward. https://angularfirebase.com/lessons/infinite-scroll-firestore-angular/<br />
<br />
Firestore: https://cloud.google.com/firestore/docs/<br />
Angular Directives: https://angular.io/guide/attribute-directives]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:34 +0000</pubDate>
   <media:content medium="video" duration="665"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Infinite Scroll Pagination with Firestore</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/e84701454-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;Use Angular and Firestore to add infinite scroll pagination to your app from scratch - both downward and upward. https://angularfirebase.com/lessons/infinite-scroll-firestore-angular/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Firestore: https://cloud.google.com/firestore/docs/&amp;lt;br /&amp;gt;
Angular Directives: https://angular.io/guide/attribute-directives]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/e84701454-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=e84701454</guid>
  </item>
  <item xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/">
   <title>Learn @ngrx/entity and Feature Modules</title>
   <link>https://www.webhostingchannel.com/watch.php?vid=164bca4c1</link>
   <description><![CDATA[<p><img src="https://www.webhostingchannel.com/uploads/thumbs/164bca4c1-1.jpg"  /></p>Learn how to use the new ngrx entity package to build CRUD with less code.  In this video, I show you how to create a feature module with ngrx, then use entity adapter methods in the reducer. https://angularfirebase.com/lessons/ngrx-entity-feature-modules-tutorial/<br />
<br />
Medium: https://medium.com/ngrx/introducing-ngrx-entity-598176456e15<br />
Docs: https://github.com/ngrx/platform/tree/master/docs/entity]]></description>
   <pubDate>Tue, 18 Feb 2025 23:54:34 +0000</pubDate>
   <media:content medium="video" duration="590"  type="video/x-flv"  height="401" width="638" >
   <media:player url="https://www.webhostingchannel.com/players/flowplayer2/flowplayer.swf" />
   <media:title>Learn @ngrx/entity and Feature Modules</media:title>
   <media:description>&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://www.webhostingchannel.com/uploads/thumbs/164bca4c1-1.jpg&quot;  /&amp;gt;&amp;lt;/p&amp;gt;Learn how to use the new ngrx entity package to build CRUD with less code.  In this video, I show you how to create a feature module with ngrx, then use entity adapter methods in the reducer. https://angularfirebase.com/lessons/ngrx-entity-feature-modules-tutorial/&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Medium: https://medium.com/ngrx/introducing-ngrx-entity-598176456e15&amp;lt;br /&amp;gt;
Docs: https://github.com/ngrx/platform/tree/master/docs/entity]]&amp;gt;</media:description>
   <media:thumbnail url="https://www.webhostingchannel.com/uploads/thumbs/164bca4c1-1.jpg" />
   </media:content>
   <guid>https://www.webhostingchannel.com/watch.php?vid=164bca4c1</guid>
  </item>
 </channel>
</rss>