Angular Tutorial for Beginners - Web Framework with Typescript Course

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
This is an amazing beginner's Angular course,  Slobodan is a very experienced developer.   And he teaches the basics of Angular, using  diagrams, animations, and of course code. Today,   I'm starting with a new video series about  Angular framework. And in this series,   you will learn all the things you need to master  Angular framework. I'll start with basic stuff   like components and pipes, and slowly progress,  the most complex features of this framework.   So let's start. In this section, I'm going  to explain what Angular is give some brief   overview of its features and explain why  you should use it. But before we start,   make sure to check my channel for more videos,  and tutorials about front end development. Now,   let's start. Angular is opinionated UI framework  for building mobile and desktop applications.   And it's built using TypeScript by Google.  You've probably heard about that one.   Also, it is an open source and helps us  build dynamic and single page applications.   It is completely based on components. It consists  of several components, which forms a tree   structure with parent and child components. Angles  versions beyond two plus are generally known is   angular only. The very first version of Angular  is known as Angular JS. So why Angular? Well,   because it's supported on various platforms,  web, mobile, desktop native, it's powerful,   modern, has nice ecosystem. And it's just cool  that the mist, let me give you some facts.   Angular presents you not only the tools, but  also design patterns to build your project in   a maintainable way. In an Angular application is  crafted properly, you don't end up with a tangle   of classes and methods that are hard to modify,  and even harder to test. The code is structured   conveniently, and you won't need to spend much  time in order to understand what is going on.   It's JavaScript, but better. Angular is built with  TypeScript, which in turn relies on GS ESX. You   don't need to learn a totally new language, but  you still receive features like static typing,   interfaces, classes, namespaces, decorators, etc.  No need to reinvent the bicycle. with Angular,   you already have lots of tools to start crafting  application. Right away. You have directives to   give HTML elements dynamic behavior, you can power  up the forms using form control and introduce   various validation rules. You may easily send  a synchronous HTTP requests various types, you   can set up routing with little hassle, and there  are many more goodies that Angular can offer us.   components are decoupled, angular strive to remove  the tight coupling between various components of   the application. injection happens no j style,  and you may replace various component VDS. All   DOM manipulation happens, where it should happen.  with Angular euren, tightly coupled presentation   and application logic, making your markup much  cleaner and simpler. Testing is at the heart.   Angular is meant to be thoroughly tested, and  it supports both unit and end to end testing.   Angular is mobile and desktop ready, meaning  you have one framework for multiple platforms.   Angular is actively maintained, and  has a large community and ecosystem.   You can find lots of materials on this framework,  as well as many useful third party tools.   The architecture diagram indentifies, the eight  main building blocks of an Angular application.   Angular apps are modular, and an  Angular has its own modularity system,   called Angular modules, or enshi. modules. Every  Angular app has at least one Angular module class,   the root module, conveniently named app module.  While the root module may be the only module   in a small application, most apps have many  more feature modules. Each a cohesive block   of code dedicated to an application domain, or  workflow are closely related set of capabilities.   in Angular module, whether a route or a feature  is a class with an NGO module decorator.   Angular templates are dynamic. When  Angular renders them it transforms the DOM   according to the instructions given by directives.  Metadata tells Angular how to process a class.   Service is a broad category encompassing any value  function or feature that your application needs.   Almost anything can be a service. A  service is typically a class with a narrow,   well defined purpose. It should do something  specific and do it well. Examples include   logging Service data service message bus  tax calculator application configuration.   There is nothing specifically about Angular  services. Angular has no definition of a   service. There is no service base class and  no place to register a service. Yet, services   are fundamental to any Angular application.  components are big consumers of services.   Now let's talk more about components in detail.  components are the main building block of Angular   application. Each component consists of an HTML  template that declares what renders on the page,   a TypeScript class that defines behavior, the  CSS selector that defines how the component   is used in our template, and optionally,  CSS styles applied to the component.   A component must belong to an NGO module in order  for it to be available to another component.   Why do we use components? There are many reasons  but the main ones are, you're able to reuse our   code so we don't duplicate simplify component  based architecture, easy to do error handling,   and breaking down the complexity into smaller  pieces. prerequisites for these sections are   install the angular COI, and create an Angular  workspace with the initial application.   If you don't have a project, you can create one  using mg new project name, where project name is   the name of your application. Although the angular  satellite is the easiest way to create an Angular   component, In this tutorial, we will create our  component manually. To create a new component.   Navigate to your Angular project directory.  Create a new file hello world component Ts file.   At the top of the file, add  the following import statement.   After the import statement, add a component  decorator decorator marks a class is an   Angular component in provides metadata that  decides how the component is use at runtime.   Choose CSS selector for the component. This is a  tag which you will be using in your template files   to render your component defined the HTML template  that the component uses to display information.   In most cases, this template is a separate HTML  file, but I'll use it within this file. To define   a template as external file. Add a template  URL property to the component decorator.   For a template within the same  file, use template property.   Select the styles for the components template.  In most cases, you will define the styles for a   components template in a separate file. Again, I  will use it within the file to declare the styles   for a component in a separate pile, or the style  URLs property to the Add Component decorator.   But for the styles within the  component, add styles property,   add a class statement that includes the code for  the component. Here we can define properties,   methods, catch component lifecycle events,  and do dependency injection. But I'll talk   more about these in the next video. Now, all the  public properties that are defined in the class   are accessible in the HTML template. And  this is one of the most powerful things here,   I'll create a title property, and  I will include it in the HTML.   import that new file in the  module where you want to use it,   to make it available for the whole app imported  in the root module. In order to see our component,   we can use our CSS selector inside of our app  component or any other component. And this is   your first component. Very simple though, you  can reuse across your area. In this section,   we are talking about lifecycle hooks. There are  special functionality in Angular that allows us to   hook into and run code. And a specific lifecycle  event of a component or director can look at them   as pages of component life. Like every living  being cast, they get born, they change, they grow,   and eventually they die. With lifecycle hooks,  you can gain better control of our application   when we want to use them. For example, if you want  to fetch some data in this page in your component,   you will do that inside of MG on in its lifecycle  when a component gets initialized, or if you   need to clean up your component remove some  subscriptions, you might have to prevent memory   leaks, you will do that inside of NGO ondestroy  lifecycle just before component gets destroyed.   This is the list of all hooks in exact order how  they get initialized, but most use ones are on it   on changes and ondestroy. let's implement the NGO  on it, hook it up. We'll be using this hook the   most first in input on an interface from Angular  core. Next, we want to implement this interface   inside of our class. To implement any hook, you  just need to add an energy to the interface name,   and you will get the method needed for  implementation. So in this case, it's mg on in it,   we will create a simple function for logging  some values to the console. Now, I will create   a property they will save that function so that  we can clean it up at the end. In the NGO on init   method, let's create a simple set interval method  which will make a console log on every second.   If you leave our component like this, when the  component gets destroyed, our interval method   will continue to log to console. To fix this side  effect, we need to use the NGO on destroy hook.   Import on destroy interface  in place the next on in it.   Now create the NGO ondestroy method and in this  method, you need to clean up this interval.   Simply use a clear interval method with  our property passed as an argument.   And now our component has been cleaned up.  Using lifecycle hooks, we're going to fine tune   the behavior of our components during creation,  update and destruction. Next, text interpolation.   Text interpolation in Angular is a one way data  binding technique that is used to transfer data   from a TypeScript code to an HTML template. It  uses the template expression in double curly   braces, also known as a mustache syntax to display  the data from the component to the view. When do   we need a text interpolation? Every time we want  to make something dynamic in our HTML template.   To illustrate how interpolation works, let's  create a new variable in our Ts class. You   can use interpolation to display the value of  this variable in the corresponding component   template. Angular replaces title with the string  value of the corresponding component property.   In this case, the values hello world. Now let's  talk about template expressions. A template   expression produces a value and appears within  double curly braces. Let me show you an example.   Angular resolves the expression and assigns  it to a property of a binding target. template   expressions are similar to JavaScript, except you  can't use assignments. Also operators such as new   type of or ease to solve. You can't use chaining  expressions decrement, or increment operators and   some of the ies 2015 plus operators. expressions  can also invoke methods. So let's create one   name of our method that will be get made.  And in this method, we are returning value   for displaying it in our template. In  this case, it will be a minimum value.   Couple of things I want to mention, you should  keep application logic in the component as much   as possible, where it is easier to develop and  test. Also, expressions should finish quickly   to keep the user experience as efficient as  possible, especially on slower devices. And   template expression should not change any  application state other than the value of   the target property. Reading a component value  should not change some other displayed values.   Now let's learn how to communicate  between the components.   in Angular application usually consists of  many separate components. And in order to make   them work together, we need communication  between them. You can think of components   as family members. And if communication between  the parents and kids is fluid and efficient,   your home will be a happy place. There are four  ways to communicate between the angular components   binding using input and output reference by using  view child and content provider using services   and templates outlined. In this tutorial,  I'm going to cover the first two ways   as we haven't covered services yet. And a  template out that is a little bit of that.   First use case is when we want to send data from  parent to child using input decorator. Input   decorator takes the value passed from parent  and stores that value in the child property.   Let me create two components using Angular CLA.   I will run the following commands and G generate  component parent and angiogenic component child.   In our child component, I  will import input decorator.   In name our input is child message of type string   In a template of the same component, I will  display this property which is going to be   passed from a parent. Now, inside of our parent  component in the template, we want to place our   child component and to pass the value to the input  property we just created. The name of the property   is the one we defined in the child component,  and the value is going to be a Hello message.   Next, we want to place our parent  component inside of our root component.   And if we preview it, we can see their message  from parent has been displayed in our child   component. Second use case is when we  want to send data from child to parent   using output decorator. Output decorator marks  a property in a child component is a doorway   through which data can travel from the child  to the parent. This approach is ideal when you   want to share data this occurs on things like  button quick form entries in other user events.   To raise it an event, an output must have the type  of event emitter, which is a class in the angular   core that used to emit custom events. In the child  component input output decorator an event emitter.   We declare a message event variable with the  output decorator and set it to equal to a new   event emitter. And then we create a function  named send message that calls a method on this   event with the message we want to send. Lastly,  we create a button to trigger this function.   In the parent, I will create a function to receive   the message and I will just simply alert  this message for demonstration purposes.   Now in the parent template, call our function  once the event from the child component occurs.   And the name of that event is the one  that we defined with output decorator.   Very simple and effective. Compared with  all other approaches for communication,   binding is the cleanest and the simplest one, it  is the most maintainable wait for passing data,   as binding is always the most preferable way  that Angular developers should consider first.   Third use case is when we want to send data  from child to parent using view child view child   allows the child component to be injected into a  parent component. It will give the parent access   to its properties and functions. Each child  won't be available to give access until the   viewer has been initialized. This means we need  to implement the after view init lifecycle hook   to receive the data from the child. First create  a message property in our child component.   Import view child in after view init.  From Angular core in our child component.   For our view, child decorator, pass our child  component as an argument in named as child.   Next, implement after view init lifecycle hook.  By the way to learn more about Angular hooks,   check the part two of this video series inside  the MG after view init method just alert the   message property of our child so that you  can see that we have access to it. And if we   start our application, you can see that we are  displaying a message from the child component.   Next, we are discussing component styles. Being  able to style your app is very important because   it allows you to make your app unique and  attractive. In a way it's like a beauty salon.   World Without CSS would be an ugly place. css  gives us the opportunity to play with a page   layout, adjust colors and fonts, add effects  images, and so on how to add styles to Angular   components. There are three ways you can apply  style by setting style or style URLs metadata,   in light the template HTML, and three with CSS  imports. I created one blank component with only   h2 tag in the view to demonstrate all different  ways we can style it. You can add a styles array   property to the component decorator, each string  in the array define some CSS for This component   can load styles from external CSS files by adding  a styles URL property to a components decorator.   And now styles from external  file are being applied. Next,   you can embed CSS styles directly into the HTML  template by putting them inside of style tags.   You can also write the link tags  into the components HTML template.   One note here is to be sure  to include the link styles   file among the assets to be copied  to the server when building.   You can also import CSS files into the CSS  files using the standard CSS import rule.   I usually use this approach to import variables.   Reminder, these styles apply only to this  component. So if you held h1 tag in a child   or parent component, it won't be applied there.  By default view encapsulation is said to emulated   and emulates the behavior of the Shadow DOM  by pre processing and renaming CSS code to   effectively scope the CSS to the components view.  We can remove these additional CSS selectors by   setting encapsulation to none. And now our styles  are being applied globally. Global styles are by   default defined in the style CSS file, and you can  find more global styles in the angular JSON file.   Another thing is that if you're building with  the COI, you can write style files in sass,   less or stylus, and specify those files in the  component style URLs metadata, be the appropriate   extension as in the following example. Now  let's talk about special selectors. Use the host   pseudo class selector to target styles in the  element that hosts the component is opposite to   target elements inside the components template.  For example, we can write the following code.   We can style host styles with the given selector  by using the function form as the following.   And if you add active class to host component,  you can see that styles are being applied.   Now let's talk about host context. Sometimes it's  useful to apply styles based on some condition   outside of the components view. For example, a  CSS theme class can be applied to the document   body element. And you want to change  how your component looks based on that.   The following example applies  a background color style to all   h2 elements inside of the component. Only if  ancestor element has the CSS class theme light.   Now if you go to root element, add theme  like class, you can see those styles.   And that's it. Now let's see what is mg content.  Anti content uses the content projection to take   HTML of another component and to displayed inside  itself. To me, it's similar to a film projector,   where you have a slot to insert your content,  which is going to be displayed on the screen.   It's a very powerful tool when you're  building components intended for reuse.   I see it used extensively in frameworks such  as NGO material. When do you want to use energy   content? anytime you want to inject any kind of  HTML into a component, you can do so mg content.   I have two components child and root component  to demonstrate this feature inside the child   component, I will create some static content.  So I'll add an h2 title. And below that title,   I want to show that dynamic content. So  I will create an mg content tag. With the   MG content element in place. Users of this  component can now project their own message   into the component. To do that, let me  insert a child inside of our root component   and I will pass paragraph in a message.   As you can see, the energy content element  is a placeholder that does not create a   real DOM element. Now, except single  a component can have a multiple slots.   Each slot can specify a CSS selector that  determines which content goes into that slot.   This pattern is referred to as  multi slot content projection.   You can accomplish this task by using the Select  attribute of Andry content inside of our child   component. add one more Angie content add, we  can make our component to be like a question and   answer card. So in the first entry content, add  question selector and put a second edgy content   add answer selector. Now, we can use the selectors  to send different content. In our route component,   I will create a stream title request  selector, and I will type this question text.   Below, I will create a paragraph get an answer  selector, and I will type an answer text.   Also, there are a couple other ways to create  multi slot content projection. But we haven't   covered conditionals yet. As you can see, it's  really easy to create reusable dynamic components.   This approach can be used for much more complex  user interfaces. But I showed you this simple   example to understand the concept. Next, let's  discuss template statements. A template statement   is something that responds to an event raised by  a target like an element component or directive.   So it's the same thing as if someone  is calling you, which is an event   and you're answering that phone call,  which is the response and in our example,   template statement. It commits side effects as  it changes the fields in the component. Now,   I will show you how to update class  properties. Using a template statement.   I have a blank component and in our template,  I will create a Boolean property named show   text in a value of false. Below that, I  will create a method named toggle text,   it's not going to return anything at this point.  All we are going to do here is to toggle our show   tax value on every method call. Usually, we would  use this kind of property to toggle the state   in the view, but we haven't covered  conditionals yet. So in the template,   I'm going to create a button which will respond on  a click event and it will call this toggle method.   Below that I will adjust the  state or show tax property.   And now when I click the button, you can see  that it toggles the its value using template   statement. And in this example, toggle text is  template statement. This statement context may   also refer to properties of the templates  own context. In the following example,   toggle text takes the templates own event  object as an argument. If you log that object,   you can see that it contains various information  about a target and the event that occurred.   Passing arguments can be very useful when you're  submitting the forms or looping through arrays,   and you need to access a specific element.   One odd here is that the context of a template  statement can be the component class instance, or   the template. Because of this, template statements  cannot refer to anything the global namespace,   such as window or document. For example, template  statement can call console log or math max.   pipes. pipes are simply functions you can use  in your templates to accept any input value   and return a formatted value. In this case,  you can see your data is untouched clay,   which is ready to be mold. At the beginning, it's  not very nice or clear what it's for. But with a   little bit of crafting and molding, you can get  the end result that you want. Angular provides   building pipes for typical data transformation  like bait pipe, uppercase pipe, currency pipe,   percent pipe, and similar. In my app component, I  will define a property with a value of new date.   If we just display our date object in our  template, you can see what kind of format we   get. It's not very user friendly. Now let's make  it nicer. To apply a pipe use the pipe operator   within a template expression along with the name  of the pipe, which is the date for the built in   date pipe now this is my more readable. One out  here, date pipe is executed only when it detects   a pure change to the input value. A pure change  is either a change a primitive input value such as   string, number, Boolean or symbol, or a change  object reference, such as date, array function,   or object. If you still don't like the  output format of your data, you can fine   tune it by using optional parameters. There are  predefined options like short or long, and others   or you can customize it completely. For  example, Allbright for ease for a day in a week   for EMS for a month, one lowercase D for an  A in a month and one lowercase y for a year.   You can also change multiple pipes as well, you  just add another pipe operator in a pipe name.   Now, we can create custom pipes as well. Let's  create a simple greetings by that will concatenate   hello to pass name. I'll use Angular Seelye to  generate this file for me. So type mg generate   pipe and the name is reading's pipe. In our  pipe, we have boilerplate code generated.   You can see that pipe decorator has been imported  with a name property, which we can use to call   our pipe in our templates. Also, there is a pipe  transform interface which needs to be implemented.   This interface requires the transform  method to be implemented. And this method   receives a value passed from a template. In our  case it will be a string. And the second parameter   is for optional params. From pipe itself.  return type in our case is going to be a string.   Now all we're going to do here is to concatenate  Hello wonder pastoring and return that.   Now in our template, we can call our custom pipe  with the greetings pipe name that we defined,   and I will pass world is our string. Now that's  how you create a custom pipes. Angular pipes are   very simple, but useful functionality provided  by Angular, and you will use them a lot. Once   again for a detailed list of all pipes check  the documentation link from the description.   Now let's discuss property binding. Property  binding moves a value in one direction. So you   can see is one way street. You can go the other  way. It goes from class property to target element   property. Property binding in Angular helps  you set values or properties of HTML elements   or directives. With property binding, you can  do things as toggle button functionality set   paths programmatically, and share values between  components. To bind the source property of an   image element to a components property plays a  target source in the square brackets followed by   an equal sign, and then the property.  The property here is item image URL.   Declare the item image URL property in  the class, in this case, app component.   A common point of confusion is between the  attribute call span and the property call span.   Notice that these two names  differ by only a single letter.   If you wrote something like this, you'll get the  template parse our interpolation and property   binding can set only properties, not attributes.  Instead, you'd use property binding and write it   like this. Another example is disabling a button  when the component says that it's unchanged.   To disable advanced functionality depending on a   boolean value, binding down disabled property to  a property in the class. That's true or false.   Because the value of the property is unchanged,   it's true in the app component  Angular disables the button.   Often interpolation in property  binding can achieve the same result.   The following binding pairs do the same thing.   One odd evaluation of a template expression should  have no visible side effects. You shouldn't be   assigning anything in the template expression  or using increment or decrement operators.   If you had an expression that changed the value  of something else that you were binding to,   the change of value would be a side effect.   Now let's see but our attribute, class and style  bindings. Using these bindings, you can improve   accessibility dynamically style your application  in update classes on the fly. First, let's talk   about attribute binding. Attribute binding in  your your helps you set values or attributes   directly. It is recommended that you set an  element property with a property binding whenever   possible. However, sometimes you don't have an  element property to bind. In those situations,   you can use attribute binding attribute binding  syntax resembles property binding, but instead of   an element property between brackets, you proceed  the name of the attribute with prefix ATR followed   by a dot. Then you set the attribute value  with an expression that resolves to a string.   Another common use case for attribute binding  is with the call span attribute in tables.   Mining the call span attribute helps you keep your  tables programmatically dynamic. Depending on the   amount of data that your application populates  a table with the number of columns their row   span could change. To use attribute binding  with the TD attribute coursepack specify the   call span attribute by using this syntax set  attribute called span equal to an expression.   In this example, we bind the call span  attribute to the expression one plus one.   This binding causes the table row to span two  columns. Sometimes there are differences between   the name of property and an attribute. Call span  is an attribute of table row, while call span with   the capital S is a property when using attribute  binding, use call span with a lowercase s.   For more information on how to bind to the cost  and property, check out the video about the   property binding. Now let's move to class binding.  You can use class binding to add and remove CSS   class names from an elements class attribute. To  create a single class binding use the prefix class   followed by a dot and the name of the CSS class.  Angular adds the class when the bound expression   on sale is truthy. And it removes the  class when the expression is faulty.   With the exception of undefined. To bind the  multiple classes use class set to an expression.   The expression can be one of a space  delimited string of class names.   An object class names as the keys and  30 old policy expressions as the values   an array of class names. With the object format,  angular adds a class only if its associated value   is truthy. And finally, let's talk about style  binding. You can use style binding to set styles   dynamically. To create a single style binding.  Use the prefix style followed by a.in the name   of the CSS style property, angular sets the  property to the value of the bound expression,   which is usually a string. Optionally, you can  add a unit extension like M or a percentage, which   requires a number type. You can write a style  property name in either dash case, or camel case.   To toggle multiple styles, bind to the  style attribute the style expression   the style expression can be one  of a string list of styles. Or   an object with style names is the  keys in style values as the values   and note that binding in the  rate to style is not supported.   This time I'm talking about event binding.  Event binding allows you to listen for and   respond to user actions such as keystrokes,  mouse movements, clicks and touches.   It's similar to float fishing as you're waiting  for a fish to take your bite. And once it drips   off, you respond quickly and strike. To bind an  event you use the angular event binding syntax.   The syntax consists of an event name within  parentheses to the left of an equal sign in   a template statement to the right. In this  example, the event name is click and the   template statement is unsaved. We can now  define the unsaved method. In RTS class.   And once we click our button, that event has been  bound and our method is executed. We can also bind   to custom events. To demonstrate that I'll create  an item details component. In this component, I'll   create an event emitter with output decorator,  which exposes our property to parent components.   Then I'll create a delete dummy method, which  will just emit our property once we call it.   Now, I'll define a button and  bind this method to a click event.   Next, I'll place our item details  component in our app component. And   I will bind to the Delete request  custom event that we just created.   I'm calling the lead item method. And I'll  use the event parameter to catch the string   sent with this event. And now I'll  define the Delete item method narrow   class and just log what we got. And  that's how you bind to custom event.   Now let's see two way binding connection.  Two Way binding is the concept of sharing   and giving. What you give is what you can expect  from others. Why to a binding to a binding gives   components in your application a way to share  data, use two way binding to listen for events   and update values simultaneously between parent  and child components. Angular is two way binding   syntax is a combination of square brackets in  parentheses. This syntax combines the brackets   of the property binding with the parentheses of  event binding. I'll create a sizer component.   In our component, I will define a size  value property in a size change event.   The size property is an input, so data can flow  into the size or component. The size change event   is an output, which allows data to flow out of  the size or component to the parent component.   Next, there are two methods that decrease the font  size and ink to increase the font size. These two   methods use Resize to change the value of the  size property within min max value constraints.   And to emit an event that  conveys the new size value.   In the sizer component template, I'll create two  buttons that each bind the click event to the   ink and deck methods. When the user clicks  one of the buttons the sizer components,   called the corresponding method. Both methods ink  and deck called the resize method with a plus one   or minus one, which in turn raises the site change  event with the new size value. And below them,   I'll add a label which displays the size  property in dynamically a bit its own font size.   In our root app component, I'll  include an app sizer component,   and I will use two way binding to bind font  size PX property to the size or component.   And below that, I'll add a div which will  utilize this property to adjust its text size.   In the app component, one size PX establishes  the initial size or component size value   by setting the value to 16. Clicking the  button at this the app component font size px,   the revised font size PX value updates style  binding, which makes the display text bigger or   smaller. The two way binding syntax is shorthand  for a combination of property binding and event   binding. The sizer component binding a separate  property binding. An event binding is as follows.   The event variable contains the data of the size  or component size change event. Angular assigns   the event value to app component font size  PX when the user clicks the buttons. To use   two way binding with Purim elements, we need mg  model which I will cover in the forum section.   Next ones are template variables. template  variables helps you to use data from one part of   a template. In another part of a template. It's  a variable that is created in an indentifies a   component or element within the template itself.  So it's like a phone number of a component,   which you can use to call in case you need  something from it. With template variables, you   can perform tasks such as respond to user input,  or finally tune your applications for syntax.   In the template, you use the hash  symbol to declare a template variable.   The following template variable phone declares  a form variable when an input element,   you can refer to a template variable  anywhere in the components template.   Here a button further down the template  refers to the form variable. Now we can   define the call form method and log the past  value, which is the actual value of the input.   So what is the template variable scope, you can  refer to a template variable anywhere within its   surrounding template. Structural directives such  as Angie and Angie for which we'll cover in the   later videos, or Angie template, act as a template  boundary, you cannot access template variables   outside of these boundaries. So can we  access variables in a nested template,   an inner template that can access template  variables that the outer template defines.   In the following example, changing the  text in the input changes the value in   the span because Angular immediately updates  changes to the template variable ref one.   In this case, there's an implied Angie  template around a span and a definition   of the variable is outside of it. So is the  same thing as binding explicitly like this.   However, accessing that template variable  from outside the parent template doesn't work   is the same as writing the following.   And that's all for template variables.   Now, let's discuss directives is the same as if  you are a CEO of the company. And you are giving   directives to your employees how to behave in what  to do in certain situations. What are directives.   directives are classes that add additional  behavior to elements in your Angular application.   with Angular built in directives, you can  manage forms, lists, styles, and what users see.   The different types of Angular directives are as  follows. Components directives with a template   this type of directive is the most common  directive type attribute directives. directives   that change the appearance or behavior of  an element component or another directive.   Structural directives, directives that  change the DOM layout by adding and removing   DOM elements. Today, we are talking about  built in attribute directives. Attribute   directive listens to and modify the behavior  of other HTML elements, attributes, properties,   and components. Many angii modules such as  router module and forms module, they find   their own attribute directives. The most common  attribute directives are as follows. mg class   adds and removes a set of CSS classes and G style  adds and removes its set of HTML styles. And model   adds two way data binding to an HTML form element.  How to add and remove classes with NGO class.   You can add or remove multiple CSS classes  simultaneously with mg class. To add or   remove a single class use class mining rather than  entry class. When the element you'd like to style,   add Angie class and set it equal to an expression.  In our class. Let's define you special as true   Because is special is true and reclass  applies the class of special to the diff.   To use NGO class with a method  add method to the component class.   In the following example, set current classes sets  the property current classes with an object that   adds or removes three classes based on the true or  false state of three other component properties.   Each key of the object is a CSS class name. If a  key is a true and your class as the class if a key   is false, and re class removes the class. Boolean  values are hard coded just for demonstration.   In the template, added the N g class property  binding to current class to set the elements   classes. And now we can preview our classes. Now  let's talk about mg style. You can use mg style   to set multiple inline styles simultaneously based  on the state of the component. To use edgy style   and the method to component class. Add empty  object current style. In the following example,   set current style says the property current  styles with an object that defines three styles   to set elements styles, and an energy style  property binding the current styles. For this   use case, angular applies the styles upon initial  annotations. And in case of changes. To do this,   the full example called set current  styles initially with NGOs in it.   And the last one in today's video is NGO  model, you can use the NGO model directive   to display a data property and update  that property. When the user make changes.   Input forms module and add it  to NGO modules import list.   I'll create a label and an input for this example.   Add an mg model binding of an HTML  form element and set it equal to the   property here its name. Now, if you define  property inside of our component class,   you can see how mg model directive  adds two way data binding to our input.   This mg model syntax can only set a data bound  property. When you write an Angular component,   you don't need a value accessor or mg  model if your name, the value and even   properties according to Angular to a binding  syntax. And that's all for this section.   In this section, we are continuing with Angular  directives. Let's build attribute directive. Let's   create a file highlight that directive.ts which  is the convention that you always should follow.   Next, import directive decorator from core and  implement that decorator with selector property.   For me, it's going to be app highlight.   Next, we want to export our class. And the last   thing we want is to import that in  our declarations array in app module.   That's our directive boilerplate code, which can  also get with the command mg generate directive   highlight. Import element ref from Angular core.  Element ref grants direct access to the host DOM   element through its native element property.  And element ref in the directive constructor   to inject a reference to host DOM element, the  element to which you apply app highlight. Add   logic to the highlight directive class that sets  the background to yellow. To use the highlight   directive add a paragraph element to the HTML  template with the directive as an attribute.   Angular creates an instance of highlight directive  class and inject in the reference to the paragraph   element into directive constructor, which has  the P elements background style to yellow.   Now, let's see how to detect when a user  mouse's into or out of the element and to   respond by setting or clearing the highlight  color. Import host listener from Angular core   Add it to event handlers that respond  when the mouse enters or leaves,   each with a host listener decorator. With the host  listener decorator, you can subscribe to events of   the DOM element that hosts an attribute  directive. The paragraph in this case,   the handlers delegate to a helper method highlight  that says the color on the host DOM element L.   The background color appears when the  pointer hovers over the paragraph element   and disappears as the pointer moves  out. Now, let's see how we can make   the directive dynamic to be able to use it  at different places with different colors.   In highlight directive Ts File, Import input from  Angular core, add an app highlight input property.   The input decorator adds metadata to  the class that makes the directive app   highlight property available for binding.  In app component Ts add a color property   to the app component. To simultaneously applied  the directive and the color. Use the property   binding with the app highlight directive selector  setting to equal to color. The app highlight   attribute binding performs two tasks applies the  highlighting directive to the paragraph element   and sets directive highlight color with the  property binding. And that's all for this one.   This is the last section about directives.  So let's see what are structural directives.   Structural directives are responsible for HTML  layout. They shape or reshape the dome structure,   typically by adding removing and  manipulating the host elements   to which they're attached. This section introduces  the most common built in structure directives.   mg conditionally creates or disposes of sub  views from the template and you for repeat a   note for each item in a list. And you switch a set  of directives that switch among alternative views.   You can add or remove an element by applying an mg  if directive to a host element. When Ngf is false,   angular removes an element and  its descendants from the DOM.   Angular then disposes of their components,  which frees up memory in resources to add or   remove an element by the engine if they condition  expression such as is active in this example.   vendor is active expression returns a  true value Ngf as the div to the DOM.   When the expression is false, he Ngf removes  the dim from the DOM. That's simpler right.   Now let's talk about mg four. You can use the  NG g4 directive to present a list of items.   Let's create an array of objects  with the name property in it.   Define a block of HTML that determines how Angular  renders a single item. to list your items assigned   the shorthand lead item of items to energy for  the string lead item of items instructs Angular   to do the following. Store each item in the  items array in the local item looping variable,   make each item available to the template HTML for  each iteration. Translate lead item of items into   energy template around the host element. Repeat  the energy template for each item in the list. By   the way, you can get the index of energy for in a  template input variable in use it in the template   in the NG g4, add a semicolon and let  i equals to index to the shorthand.   The following example guys the index in a variable  named I in these days it within the item name.   And the less directive which  we are going to talk about   is switch like the JavaScript switch  statement. And just switch displays   one element from among several possible  elements based on a switch condition.   Angular puts only the selected element into the  DOM. And g switch is a set of three directives.   And you switch an attribute directive that  changes the behavior of its companion directives   and j switch case structure directive that adds  its element to the DOM. When it's bound value   equals to switch value and removes  its bound value when it doesn't equal   the switch value. Andrey switch default structural  directive that adds its element to the DOM.   When there is no selected energy switch case, I'll  modify the items array to be just a single item.   On an element such as I do, add Angie switch   bound to an expression that returns  the switch value such as a name.   Though the name value in this example is a  string, the switch value can be of any type   bind to mg speech case and mg speech  to default on the LMS for the cases.   And now depending on the value of the  item name rendering on the page changes.   If it didn't provide a case for the  name value, default will be executed.   Next, we are discussing dependency injection.  dependencies are services or objects that a class   needs to perform its function. dependency  injection, or di is a design pattern in which   a class request dependencies from external sources  rather than creating them. You can look at it as   if you're adding an extension to your browser,  or adding an app to a phone. Once you add it,   you provide yourself with the new functionalities  and features nice extension. Let's create a   service which we can inject in our components.  Create a new file with the name log.service.ts.   Import injectable decorator from Angular core.  And then for provided in metadata add root value,   which means that we are going to provide  the service in the root of the application   and that is visible throughout the application.  export our log service class and inside of this   service, we want to add our log message  method, which will just log past messages.   For clarity in meeting ability, it is recommended  that you define components and services   in separate files now inject our log service into  the app module file in providers array. injecting   service results in making them visible to a  component. to inject a dependency in components   constructor supply a constructor argument  with dependency type. The following example   specifies the lock service, the app component  constructor to type of log service is log service.   Now we can reference our log service in  our component and call our method from it   should pass our message and as you can  see it's being executed. As expected.   We can use this approach to inject third party  libraries in other modules that are available   in the angular framework. So let's inject render  to module which is used for custom rendering   and updating the DOM. Import render to from  Angular core and injected inside the constructor.   Also, we will need element ref, which we  can use for referencing our DOM elements,   or the host component in our case.  Now inside the NG on init lifecycle,   call the set style method of the renderer and  set the color of host native element to red.   This method changes the color of our components  tax. And as you can see, with the dependency   injection, we get access to more features  and methods. That's all there is to it.   Next is very important topic. routing. The  angular router is a core part of Angular platform.   It enables developers to build single page  applications with multiple views. In the   navigation between these views. We can compare  routing of our obligations with navigating   a plane. Pilot says the flight  coordinates in our case route path,   and the plane lands on the desired location  or desire page in our app. Oftentimes,   planes carries goods or cargo and routes  carry params info in data. And unfortunately,   some things do get crashed or lost.  And for route sometimes we get 404   To use the angular router, an application needs  to have at least two components so that it can   navigate from one to the other. To create a  component using the COI, enter the following   at the command line, where first is the name of  your component, and G generate component. First,   repeat this step for a second component or give  it a different name. Here the new name is second.   This guide works with a CI  generated Angular application.   If you're working manually, make sure that  you have base href would slash in the head   of your index HTML file. This assumes that  the app folder is the application route   and that uses slash create a new module for  routing named app dash routing dot module.   We find const routes which is type of routes.  Here we will define our paths and components.   Inside NGO module imports array add router  module in call for route module it routes passed   as argument, then export the router module  so it can be imported into the route module.   At the end, define the app routing module class   imported app routing module into app  module and add it to the imports array.   Now define your routes in your routes array. Each  route in this array is a JavaScript object that   contains two properties. The first property bath  defines the URL path for the route. The second   property component defines the component that  Angular should use for the corresponding path.   Now that you have defined your routes,  you can add them to your application.   First, add links to the two components.   assigned an anchor tag that you want to  add the rod to the router link attribute.   Set the value of the attribute to the component  to show when a user clicks on each link.   Next, update your component template  to include router outlet. This element   informs Angular to update the application view  with the component for the selected route.   You can add router link active activity if you  want to style active link. One Note the order   of routes is important because the router uses a  first match wins strategy when matching routes.   So more specific routes should be placed about  less specific routes. Often is a user navigator   application, you want to pass information from  one component to another. To do so you use the   activated route interface. First input router  activated route in para map to your component.   inject an instance of activated route by  adding it to your applications constructor.   Update the NGO own init method to access the  activator route and track the ID parameter.   Now we need to adjust our routes  to pass the ID params as well.   In that add semi colon and name of your parameter.  And then we can add ID values to our links.   That's how you pass in retrieve  data from one component to another.   A well functioning application should gracefully  handle when user attempts to navigate to a part of   your application that doesn't exist. To add this  functionality to your application. You set up a   wildcard route. The angular route selects this  route anytime the requested URL doesn't match   any router paths. To set up a wildcard route,  add the following code to your routes definition.   For the component property, you can  define any component in your application.   Common choices include an application  specific page not found component.   But here I'm just redirecting  to the first component.   And now if you navigate to any random path,  it will always give us first component.   As your application grows more complex, you  may want to create routes that are relative   to the component other than your route  component. These types of nested routes   are called child routes. This means  you're adding a second router outlet to   app because it is in addition to the router  outlet in app component. In this example,   there are two additional child components child  a and child b. here first component has its own   nav, and a second router outlet in  addition to the one in app component.   Also, I'm going to create two child routes  with the router links of child a child B   and give it a second router link.   Now I'll create two additional component with  Angular ccli in named their child a component   and child B component.   Each other route is like any other route, in  that it needs both a path and a component.   The one difference is that you place child routes  in a children array within the parent route.   Now if you navigate to any of child routes,  we get the corresponding child component.   Use route guards to prevent users from navigating  to parts of an application without authorization.   The following route guards are available in  Angular can activate connect to a child can   deactivate, resold and can load create a service  for your guard. mg generate guard your guard.   In your guard class implement the guard you  want to use the following example users can   activate to guard the route. Now depending  on your logic, it can return true or false.   Usually it's checks if the user is logged in,  or does he have privileges to access the page   in your routing module, use the appropriate  property in your routes configuration here   can activate tells the router to mediate  navigation to this particular route.   Now, if you set the guard too fast, we  can't access the route. Otherwise, we can.   And that's all for routing for this section.  After this one, we're covering one even more   important concept, and that is angular forms.  Let's start off with template driven forms. I   know it sounds impossible, but there were times  when there was no internet or even computer.   So in those times, we had to fill out good old  paper forms when we wanted to visit a doctor or   to apply for various personal documents. So web  forms are nothing different except their digital.   NGO supports two design approaches for interactive  forms. template driven forms are suitable for   small or simpler forms. While reactive forms are  more scalable and suitable for complex forms. This   tutorial shows you how to build a form from  scratch. First, import forms module in your   app root module. Let's first build our bad class  which defines a data model reflected in our form.   High will have three properties ID name is PC.   Now let's import our class in the app component.   Define a species in species array. Now create a  model from the battle. Last in pass the values   for our path. Here we're using  dummy data. But in your real app,   you would use a service to get the data from the  API and to save it. Also, let's add submitted   property, which will change depending on  the state of the form and on submit method.   Next in our HTML file, we will create  a form that reflects our data model.   Create a form and inside two  divs for two fields. First,   we'll be naming input. And I'm adding a  label and required attribute to our input.   And the second one will be a cell Act,   which will loop through an array of species  to show all the values from the array.   Same as for input, I'm adding a label for our  select. And also I'll add the required attribute.   Then I will use mg for tillow to  do all the values and display them.   If you run the application right now,  you'll see the list of species in the   selection control. The input elements are not  yet bound to data values or events. So they are   still blank and have no behavior. The next  step is to bind the input controls to the   corresponding bad properties with two way  data binding so that they respond to the user   input by updating the data model, and also  respond to programmatic changes in the data   by updating the display. The NGO model directive  declared in the forms module, lets you bind   controls in your template driven form to  properties in your data model. Add the energy   model directive using two way data binding syntax  for the name use model dot name. And for species   use model dot species value. When you use  Angie model on element, you must define   a name attribute for that element. Angular uses  the assigned name to register the element with   the energy form directive attached to the parent  form element. So in order to register our form,   add a template reference variable use the value  of MG form. The platform template variable   is now a reference to the NG g form directive  instance that governs the form as a whole.   In order to test our application plays the  model object in our template with a JSON pipe.   Now if you update your foreign films,  you will see that model is being updated.   Now the user should be able to submit this form  after filling it, create a submit button on the   bottom. the submit button at the bottom of the  form does nothing on its own, but it does trigger   us form submit event because of its type Submit.  To respond to this event. Take the following   steps. bind the forms mg submit event property  to the platform component. on submit method.   Use the template reference variable bedform.  To access the form that contains the submit   button and create an event binding. You  will bind the form property that indicates   its overall validity to the Submit buttons  disabled property. run the application now.   Notice that the button is enabled. Although  it doesn't do anything useful yet. Delete the   name value. This file is the required rule so  disable the submit button. The show I response   to form submission you can hide the data entry  area in this place something else in its place.   Wrap the entire form in a deal in bind it's hidden  property to the app component submitted property.   The main form is visible from the start  because the submitted property is false   until you submit the form as this fragment  from the app component chose to show something   else while the form is in submitted state add  the following HTML below the new div wrapper   add the properties that you  updated in the edit button.   If the user wants to update the fields again.   And now let's preview how it works.  That's all about template driven forms.   Now in the next section, we're going to see  how we can take more control of our forms   and how to create reactive forms.   Reactive forms provide a model driven approach  to handling form inputs, whose values change over   time. Each change to the form state returns  a new state, which maintains the integrity   of the model between changes. Let's add basic form  control. To use reactive form controls, import   reactive forms module from Angular forms package  and added to your NGO modules import array.   To register a single form control, import a form  control class and create a new instance of form   control to save as a class property. Use the  constructor of form control to set its initial   value, which in this case is an empty string. By  creating these controls in your component class,   you get immediate access to listen for update  and validate the state of the form input.   After you create a control in the component class,  you must associate it with a form control element   in the template Are they the template with a  form control using the form control binding   provided by form control directive, which is  also included in the reactive forms module.   Using the template binding syntax,  the form control is now registered to   the name input element in the template, you  can display the value in the following ways   through the value changes observable very can  listen for changes in the form of value in the   template using async pipe or in the component  class using the subscribe method or with the   value property, which gives you a snapshot of the  current value. The following example shows you how   to display the current value using interpolation.  In the template. The displayed value changes as   you update the form control element. Reactive  forms have methods to change it controls value   programmatically, which gives you the flexibility  to update the value without user interaction.   The following example as a method to the component  class to update the value of the control to Nancy   using the set value method. Update the template  button button to simulate a name update.   When you click the Update name button, the value  entered in the form control element is reflected   as its current value. The form model is the source  of truth for the control. So when you click the   button, the value of the input is change within  the component class, overriding its current value.   Form stabilty contains several related  controls. Reactive forms provide two ways   of grouping multiple related controls into  a single input form. First way of form group   defines a form with a fixed set of controls  that you can manage together. And second way   of form array defines a dynamic form where  you can add and remove controls at runtime.   import the form group and form control classes  from the angular forms package. Create a property   in the component class name profile form, and  set the property to a new form group instance.   to initialize the form group provide a  constructor with an object of named keys   mapped to their control. For the profile form  add to form control instances with the names   first name and last theme. The individual  form controls are not collected within a   group. After you define a model, you must update  the template to reflect the model in the view.   I'm adding two inputs and two labels that  match our model. The form control name input   provided by the form control name directive binds  each individual input to the form control defined   in the form group. The forum comm directive  lessons for the Submit event, immediate buy   the form element and emits an mg submit event  that you can bind to a callback function.   Add an mg submit event listener to the form  tag with the on submit callback method.   The onsubmit method captures the  current value of profile form.   Here, you will just log the form value.   The submit event is emitted by the form tag  using the native Dom event, you trigger the   event by clicking a button in submit type. This  allows the user to press the Enter key to submit   the completed form. Add a button to the bottom  of the form to trigger the form submission.   And that's all for reactive forms. In the next  section, we're going to see how we can improve   our forms. So in this section,  we're covering form validation.   This tutorial will show you how to validate  user input from the UI and display useful   validation messages in both reactive and template  driven forms. Anything that you want to store to   your database needs to have multiple levels  of validation and AC validation the same as   if you're at an audition, or job interview  something or whether someone is presenting   to you and you decide will he pass or not.  To add validation to a template driven form,   you add the same validation attributes as you  would with native HTML form validation. Angular   uses directives to match these attributes with  validator functions in the framework. Every   time the value of a form control changes, anger  runs validation, and generates either a list of   validation errors that results in an invalid  status or not. It results in a valid status.   I'll create a name string field  inside of our component class.   Then in our HTML file, I'll add an input text  field with required attribute me length of four.   I'm binding name input property to energy model,   and I'm exporting energy model  to a local variable called main   engine model mirrors many of the properties  of its underlying form control instance.   So can use this template to check for  control states such as valid and dirty.   The mgf of the div element reveals  a set of nested messages they have,   but only if the name is invalid, and  the control is either dirty or touched.   Each nested they have can present a custom  message for one of the possible validation errors.   These are messages for acquired admin lead.   Now if we type something and leave the field  empty, we will get the validation error message.   And the same goes if we enter value  less than four characters long.   In a reactive form, the source  of truth is a component class.   Instead of adding validators  through attributes in the template,   you add validator function directly to the  form control model in the component class.   The same built in validators that are  available as he was in template driven forms,   such as required and min length are all available  to use as functions from the validator class.   To update the validation form to be a reactive  form, use some of the same built in validators.   In this example, the name control  sets up to a built in validators   validators required in validators min length.   These validators are synchronous, so  they are passed as the second argument.   Notice that you can support multiple  validators by passing the functions   in as an array. This example also adds  a getter method. In a reactive form,   you can always access any form control  through the get method on its parent   group. But sometimes it's useful to define  and getters. It's shorthand for the template.   In our template, add form group to our form.   And now, only thing that we need to  change in our template to make it reactive   is to remove Angie Murrell and to bide  our name control to form control name.   This forum differs from the template driven  version in that delong exports any directives.   Instead, it uses the name gatter  defined in the component class,   known as the required attribute  is still present in the template.   Although it's not necessary for validation, it  should be retained for accessibility purpose.   We finally came to the end of this long tutorial,  and we're going to cover communication using HTTP   client. Imagine that you're running a TV  station or a newspaper. And what if you   lose communication to reporters, you would end  up with a blank newspaper or no news broadcasts   is the same thing with web apps. Without backend  communication, our apps will be bad without   informations or instructions on the back end.  Most front end applications need to communicate   with a server over HTTP protocol to download or  upload data and access other backend services.   Before we can use HTTP client, you need  to import Angular HTTP client module.   Most apps do so in the root app module.   Let's create data service. Most common use  case is to inject HTTP client into service.   In use it throughout the application, you can  then inject HTTP client service as a dependency   of an application class, as shown in this example.  Now let's see how we can fetch data from a server.   To do that, we're going to use HTTP client get  method. First inject HTTP client into our service.   Then create get data method and inside  of this method will fetch our data.   the get method takes two arguments the endpoint  URL from which to fetch and an options object   that you use to configure the request to add  things like parameters to your request. For this   tutorial, I found a free cocktail API service.  The link will be in the description box below,   enter the URL, and no additional  parameters are required in this case.   Now in our app component, we inject  the data service in the constructor   inside of MG on init method, let's call our  get data method. Because the service method   returns an observable, the component  subscribes to the methods return value.   I'm just gonna console log in. And  that's how you get data from the server.   In an ideal world, everything works as a magic.  But we don't live in an ideal world, fortunately,   and we lose connection with API sometimes. So we  need to handle errors when they come up. If the   request fails on the server, HTTP client returns  an error object instead of a successful response.   Let's add a pipe on our get method  and use cash error to catch it.   I'm going to log the error for development purpose  and return throw error with some message. They   should be used in your obligation to show the user  that his request has failed. Without notification,   they wouldn't know what's happening. And  don't forget to import missing packages.   Now we can change the URL to break the request.  And to see the error, we usually don't want to   see this view in our obligations. But we  need to be ready for that when it happens.   HTTP client besides get also has a POST method for  submitting data to server. For example, if you are   submitting a form, we have delete requests  for deleting data from database obviously,   a pull request which replaces a resource with  updated data. Now, most of the API's require an   authentication key with their requests. So let's  see how we can add that I found this Lord of Rings   database which requires an auth key. Let's create  HTTP options object with the headers property.   This property will be a new HD We had this  object, and we will pass two properties.   Content Type is application JSON, which means that  we're using JSON as content and authorization,   where we enter our API key barrier is  type of authorization, and follow by key.   In order to get your personal key you need to  register link is in the description box below.   Now, are they the API endpoint. And if you try  to call it without passing the HTTP options,   you can see that we get an error. What if we  add authorization the request is successful.   Congratulations, you watch all the way through the  end. This was very long tutorial and I hope you   learned a lot of new things. Also, don't forget  to subscribe to Free Code Camp. And if you want   to see more tutorials like this, don't forget  to check out my channel. My name is Slobodan,   and I'll see you guys in one of the next  videos or tutorials. Take care. Until then.
Info
Channel: freeCodeCamp.org
Views: 52,523
Rating: undefined out of 5
Keywords:
Id: AAu8bjj6-UI
Channel Id: undefined
Length: 96min 13sec (5773 seconds)
Published: Wed Oct 20 2021
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.