Apprenez Angular 6 en créant une application full-stack

Angular 6 est sorti! Les nouvelles fonctionnalités incluent de meilleures performances, de nouveaux ajouts CLI puissants et une nouvelle façon d'injecter des services.

Ce tutoriel est destiné aux débutants. Vous apprendrez Angular par exemple en créant une application Web CRUD à pile complète - Créer, lire, mettre à jour et supprimer. Nous utiliserons la dernière version du framework et de la plate-forme les plus populaires pour créer des applications mobiles et de bureau côté client. Le nom de ces applications est SPA ou Applications à page unique.

Dans le back-end, nous utiliserons Python avec Django. Django est le framework web pythonique le plus populaire conçu pour les perfectionnistes avec des délais.

En bref, vous apprendrez à générer des applications Angular 6, à générer des composants et des services et à ajouter un routage. Vous apprendrez également à utiliser diverses fonctionnalités telles que HttpClient pour envoyer des requêtes AJAX et des appels HTTP et vous abonner aux observables RxJS 6, etc.

À la fin de ce didacticiel Angular 6 , vous apprendrez en créant un exemple d'application dans le monde réel:

  • comment installer la dernière version de Angular CLI,
  • comment utiliser la CLI Angular 6 pour générer un nouveau projet Angular 6 ,
  • comment utiliser Angular 6 pour créer une application CRM simple,
  • qu'est-ce qu'une architecture basée sur des composants et des composants
  • comment utiliser les observables et opérateurs RxJS 6 ( map()et filter()etc.)
  • comment créer des composants Angular 6,
  • comment ajouter le routage et la navigation des composants,
  • comment utiliser HttpClient pour consommer une API REST, etc.

L'exemple de Django CRUD Back-End

Nous utiliserons une API CRUD simple construite avec le framework Django et Django REST. Comme il s'agit d'un didacticiel Angular, nous ne nous concentrerons pas sur la création de l'API. Cela fera l'objet d'un tutoriel séparé. Vous pouvez récupérer le code source de l'API back-end à partir de ce référentiel.

Vous pouvez utiliser les commandes suivantes pour démarrer le serveur de développement:

# Clone the project and navigate into it $ git clone //github.com/techiediaries/django-crm $ cd django-crm # Create a virtual environment and install packages $ pipenv install # Activate the virtual environment $ pipenv shell # Create and migrate the database then run the local development server $ python manage.py migrate $ python manage.py runserver

Votre serveur fonctionnera à partir de //localhost:8000.

Nous utilisons pipenv, l'outil de gestion de paquets officiellement recommandé pour Python. Vous devrez l'avoir installé. Le processus est assez simple en fonction de votre système d'exploitation.

Exemple de CRUD angulaire 6

L'exemple d'application Angular 6 que nous allons créer est le front-end d'une API CRM RESTful. Il vous permettra de créer des comptes, des prospects, des opportunités et des contacts. C'est un exemple parfait pour une application CRUD (créer, lire, mettre à jour et supprimer) construite comme une SPA (application à page unique).

L'exemple d'application est en cours de développement, nous allons donc le construire à travers une série de didacticiels. Il sera mis à jour pour contenir des fonctionnalités avancées telles que l'authentification RxJS 6 et JWT. Nous utiliserons également Bootstrap 4 et Angular 6 Material pour créer et styliser les composants de l'interface utilisateur. Vous avez besoin de Bootstrap 4 ou d'un matériau angulaire pour le style. Selon votre choix, vous pouvez suivre des tutoriels séparés:

  • Création de l'interface utilisateur avec le matériau Angular 6
  • Construire l'interface utilisateur avec Bootstrap 4

Installation de la CLI angulaire (v6.0.0)

Assurez-vous que Node.js est installé, puis exécutez la commande suivante dans votre terminal pour installer Angular CLI v 6.0.0 .

npm -g install @angular/cli

Vous pouvez vérifier la version installée en exécutant la commande suivante:

Vous êtes maintenant prêt à créer un projet à l'aide de Angular CLI v6. Exécutez simplement la commande suivante dans votre terminal:

La CLI générera automatiquement un ensemble de fichiers communs à la plupart des projets Angular 6. Il installera également les dépendances requises pour votre projet.

Nous travaillerons principalement dans le src/appdossier. Voici la structure de répertoires du projet:

Vous pouvez servir votre application localement en exécutant les commandes suivantes:

# Navigate inside your project's folder $ cd crmapp # Serve your application $ ng serve

Votre application sera exécutée à partir de //localhost:4200.

Voici une capture d'écran de la page d'accueil de l'application:

Composants dans Angular 6 | 5 | 4

Maintenant, qu'est-ce qu'un composant?

Un composant est une classe TypeScript. Il a un modèle HTML et un ensemble facultatif de styles CSS qui contrôlent une partie de l'écran.

Les composants sont le concept le plus important dans Angular 6. Une application Angular 6 est essentiellement un arbre de composants avec un composant racine (le fameux AppComponent ). Le composant racine est celui contenu dans le tableau d'amorçage du NgModulemodule principal app.module.ts.

Un aspect important des composants est la réutilisation. Un composant peut être réutilisé dans toute l'application et même dans d'autres applications. Le code commun et répétable qui exécute une certaine tâche peut être encapsulé dans un composant réutilisable. Ce composant peut être appelé chaque fois que nous avons besoin des fonctionnalités qu'il fournit.

Chaque composant bootstrap est la base de sa propre arborescence de composants. L'insertion d'un composant amorcé déclenche généralement une cascade de créations de composants qui remplissent cet arbre. La source

Architecture basée sur les composants

Une application angulaire est composée de plusieurs composants. Ces composants forment une arborescence avec des composants parents et enfants.

Un composant est un bloc indépendant d'un grand système (application Web). Il communique avec les autres blocs de construction (composants) du système à l'aide d'entrées et de sorties. Un composant a une vue, des données et un comportement associés. Il peut avoir des composants parent et enfant.

Les composants permettent une réutilisation maximale, des tests faciles, une maintenance et une séparation des problèmes.

Voyons maintenant cela pratiquement. Rendez-vous dans le src/appdossier de votre projet d'application Angular et ouvrez le dossier. Vous trouverez les fichiers suivants:

  • app.component.css: the CSS file for the component
  • app.component.html: the HTML view for the component
  • app.component.spec.ts: the unit tests or spec file for the component
  • app.component.ts: the component code (data and behavior)
  • app.module.ts: the application main module

Except for the last file which contains the declaration of the application main (root) Module, all these files are used to create a component. It’s the AppComponent: The root component of our application. All other components we are going to create next will be direct or un-direct children of the root component.

Demystifying the AppComponent (The Root Component of Angular Applications)

Go ahead and open the src/app/app.component.ts file and let's understand the code behind the main/root component of the application.

First, this is the code:

import { Component } from '@angular/core';@Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css']})export class AppComponent { title = 'app';}

We first import the Component decorator from @angular/core. Then we use it to decorate the TypeScript class AppComponent. The Component decorator takes an object with many parameters such as:

  • selector: specifies the tag that can be used to call this component in HTML templates just like the standard HTML tags
  • templateUrl: indicates the path of the HTML template that will be used to display this component (you can also use the template parameter to include the template inline as a string)
  • styleUrls: specifies an array of URLs for CSS style-sheets for the component

The export keyword is used to export the component so that it can be imported from other components and modules in the application.

The title variable is a member variable that holds the string ‘app’. There is nothing special about this variable and it’s not a part of the canonical definition of an Angular component.

Now let’s see the corresponding template for this component. If you open src/app/app.component.html this is what you'll find:

Welcome to !

Angular Logo

Here are some links to help you start:

  • Tour of Heroes

  • CLI Documentation

  • Angular blog

The template is a normal HTML file (almost all HTML tags are valid to be used inside Angular templates except for some tags such as pt>, tml>; and ) with the exception that it can contain template variables (in this case the title variable) or expressions ({ {...}}) that can be used to insert values in the DOM dynamically. This is called interpolation or data binding. You can find more information about templates from the docs.

You can also use other components directly inside Angular templates (via the selector property) just like normal HTML.

If you are familiar with the MVC (Model View Controller) pattern, the component class plays the role of the Controller. The HTML template plays the role of the View.

Angular 6 Components by Example

After getting the theory behind Angular components, let’s now create the components for our simple CRM application.

Our REST API, built with Django, exposes these endpoints:

  • /api/accounts: create or read a paginated list of accounts
  • /api/accounts/<id>: read, update or delete an account
  • /api/contacts: create or read a paginated list of contacts
  • /api/contacts/<id>: read, update or delete a contact
  • /api/leads: create or read a paginated list of leads
  • /api/leads/<id>: read, update or delete a lead
  • /api/opportunities: create or read a paginated list of opportunities
  • /api/opportunities/<id>: read, update or delete an opportunity

Before adding routing to our application we first need to create the application’s components. Based on the exposed REST API architecture we can divide our application into these components:

  • AccountListComponent: this component displays and controls a tabular list of accounts
  • AccountCreateComponent: this component displays and controls a form for creating or updating accounts
  • ContactListComponent: displays a table of contacts
  • ContactCreateComponent: displays a form to create or update a contact
  • LeadListComponent: displays a table of leads
  • LeadCreateComponent: displays a form to create or update a lead
  • OpportunityListComponent: displays a table of opportunities
  • OpportunityCreateComponent: displays a form to create or update an opportunity

Let’s use the Angular CLI to create the components

ng generate component AccountList ng generate component AccountCreate ng generate component ContactList ng generate component ContactCreate ng generate component LeadList ng generate component LeadCreate ng generate component OpportunityList ng generate component OpportunityCreate

This is the output of the first command:

CREATE src/app/account-list/account-list.component.css (0 bytes) CREATE src/app/account-list/account-list.component.html (31 bytes) CREATE src/app/account-list/account-list.component.spec.ts (664 bytes) CREATE src/app/account-list/account-list.component.ts (292 bytes) UPDATE src/app/app.module.ts (418 bytes)

You can see that the command generates all the files to define a component and also updates src/app/app.module.ts.

If you open src/app/app.module.ts after running all commands, you can see that all components are automatically added to the AppModuledeclarations array.:

import { BrowserModule } from '@angular/platform-browser';import { NgModule } from '@angular/core';import { AppComponent } from './app.component';import { AccountListComponent } from './account-list/account-list.component';import { AccountCreateComponent } from './account-create/account-create.component';import { ContactListComponent } from './contact-list/contact-list.component';import { ContactCreateComponent } from './contact-create/contact-create.component';import { LeadListComponent } from './lead-list/lead-list.component';import { LeadCreateComponent } from './lead-create/lead-create.component';import { OpportunityListComponent } from './opportunity-list/opportunity-list.component';import { OpportunityCreateComponent } from './opportunity-create/opportunity-create.component';@NgModule({declarations: [ AppComponent, AccountListComponent, AccountCreateComponent, ContactListComponent, ContactCreateComponent, LeadListComponent, LeadCreateComponent, OpportunityListComponent, OpportunityCreateComponent],imports: [ BrowserModule],providers: [],bootstrap: [AppComponent]})export class AppModule { }

If you are creating components manually, you need to make sure to include them manually so they can be recognized as part of the module.

Adding Angular 6 Routing

Angular CLI provides the --routing switch (ng new crmapp --routing) that enables you to add routing automatically. We’re going to add routing manually. I want you to understand the various pieces involved in adding component routing to your Angular application.

In fact, adding routing is quite simple:

  • add a separate module (which can be called AppRoutingModule) in a file app-routing.module.ts, and import the module by including it in the imports of main AppModule,
  • add r-outlet> in app.component.html (this is where the Angular Router will insert components matching the current path),
  • add routes (each route is an object with properties such as path and component etc.).

This is the initial content of app-routing.module.ts:

import { NgModule } from '@angular/core';import { Routes, RouterModule } from '@angular/router';const routes: Routes = [];@NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule]})export class AppRoutingModule { }

The routes will contain all the routes of the application. After creating the components we’ll see how to add routes to this array.

For now, we want to redirect the visitor to the /accounts path when the home URL is visited so the first path we'll add is:

{ path: '', redirectTo: 'accounts', pathMatch: 'full' },

The pathMatch specifies the matching strategy. full means that we want to fully match the path.

Next, let’s add the other paths:

{ path: '', redirectTo: 'accounts', pathMatch: 'full' },{ path: 'accounts', component: AccountListComponent},{ path: 'create-account', component: AccountCreateComponent},{ path: 'contacts', component: ContactListComponent},{ path: 'create-contact', component: ContactCreateComponent},{ path: 'leads', component: LeadListComponent},{ path: 'create-lead', component: LeadCreateComponent},{ path: 'opportunities', component: OpportunityListComponent},{ path: 'create-opportunity', component: OpportunityCreateComponent}];

Now open src/app/app.module.ts and import the routing module then add it to the imports array:

import {AppRoutingModule} from './app-routing.module';[...]@NgModule({declarations: [AppComponent,[...]],imports: [ BrowserModule, AppRoutingModule],[...]})export class AppModule { }

Finally, open src/app/app.component.html then add the navigation links and the router outlet:

 Accounts  Create Account  Contacts  Create Contact  Leads  Create Lead  Opportunities  Create Opportunity 

An Example for Consuming the REST API Using Angular 6 HttpClient

Now we’ve created the different components and added routing and navigation. Let’s see an example of how to use the HttpClient of Angular 6 to consume the RESTful API back-end.

First, you need to add the HttpClientModule module to the imports array of the main application module:

[..]import { HttpClientModule } from '@angular/common/http';@NgModule({declarations: [..],imports: [[..]HttpClientModule],providers: [],bootstrap: [AppComponent]})export class AppModule { }

Create an Angular 6 Service/Provider

A service is a global class that can be injected into any component. It’s used to encapsulate code that can be common between multiple components in one place instead of repeating it throughout various components.

Now, let's create a service that encapsulates all the code needed for interacting with the REST API. Using Angular CLI run the following command:

Two files: src/app/api.service.ts and src/app/api.service.spec.ts will be generated. The first contains code for the service and the second contains tests.

Open src/app/api.service.ts then import and inject the HttpClient class.

import { Injectable } from '@angular/core';import { HttpClient} from '@angular/common/http';@Injectable({providedIn: 'root'})export class APIService { constructor(private httpClient: HttpClient) {}}

Angular 6 provides a way to register services/providers directly in the @Injectable() decorator by using the new providedIn attribute. This attribute accepts any module of your application or 'root' for the main app module. Now you don't have to include your service in the providers array of your module.

Getting Contacts/Sending HTTP GET Request Example

Let’s start with the contacts API endpoint.

  • First, we’ll add a method to consume this endpoint in our global API service,
  • next, we’ll inject the API service and call the method from the corresponding component class (ContactListComponent)
  • and finally, we’ll display the result (the list of contacts) in the component template.

Open src/app/api.service.ts and add the following method:

export class APIService {API_URL = '//localhost:8000';constructor(private httpClient: HttpClient) {}getContacts(){ return this.httpClient.get(`${this.API_URL}/contacts`);}

Next, open src/app/contact-list/contact-list.component.ts and inject the APIService then call the getContacts() method:

import { Component, OnInit } from '@angular/core';import { APIService } from '../api.service';@Component({ selector: 'app-contact-list', templateUrl: './contact-list.component.html', styleUrls: ['./contact-list.component.css']})export class ContactListComponent implements OnInit {private contacts: Array = [];constructor(private apiService: APIService) { }ngOnInit() { this.getContacts();}public getContacts(){ this.apiService.getContacts().subscribe((data: Array) => { this.contacts = data; console.log(data); });}

Now let’s display the contacts in the template. Open src/app/contact-list/contact-list.component.html and add the following code:

My Contacts

First NameLast NamePhoneEmailAddress
{{ contact.first_name }} {{ contact.last_name }} {{ contact.phone }} {{ contact.email }} {{ contact.address }}

This is a screen-shot of the component:

Original text


Creating Contacts/Sending HTTP POST Request Example

Now let’s create a method to send HTTP Post request to create a random contact. Open the API service file and add the following method:

createContact(contact){ return this.httpClient.post(`${this.API_URL}/contacts/`,contact);}

Next, let’s call this method from the ContactCreateComponent to create a contact. First, open src/app/contact-create/contact-create.component.ts and add the following code:

import { Component, OnInit } from '@angular/core';import { APIService } from '../api.service';@Component({selector: 'app-contact-create',templateUrl: './contact-create.component.html',styleUrls: ['./contact-create.component.css']})export class ContactCreateComponent implements OnInit {constructor(private apiService: APIService) { }ngOnInit() {}createContact(){var contact = { account: 1, address: "Home N 333 Apartment 300", createdBy: 1, description: "This is the third contact", email: "[email protected]", first_name: "kaya", isActive: true, last_name: "Abbes", phone: "00121212101"};this.apiService.createContact(contact).subscribe((response) => { console.log(response);});};}}

For now, we’re simply hard-coding the contact info for the sake of simplicity.

Next, open src/app/contact-create/contact-create.component.html and add a button to call the method to create a contact:

Create Contact

Create Contact

Conclusion

Throughout this Angular 6 tutorial for beginners, we’ve seen, by building a simple real-world CRUD example, how to use different Angular concepts to create simple full-stack CRUD application with Angular and Django. You can find the source code in this repository.