Angular — это универсальная инфраструктура для создания мобильных и веб-приложений с использованием одного и того же повторно используемого кода. Используя Angular, вы можете разделить все приложение на повторно используемые компоненты, что упрощает поддержку и повторное использование кода.
Из этой серии руководств вы узнаете, как начать создавать веб-приложение, используя Angular с MongoDB в качестве внутреннего интерфейса. Вы будете использовать Node.js для запуска сервера.
На протяжении всего этого урока вы будете создавать приложение для ведения блогов, используя Angular, Node.js и MongoDB.
В этом уроке вы узнаете, как начать настройку приложения и создание компонента Login .
Начиная
Давайте начнем с установки Angular CLI .
|
1
|
npm install -g @angular/cli
|
После установки Angular CLI создайте папку проекта под названием AngularBlogApp .
|
1
2
|
mkdir AngularBlogApp
cd AngularBlogApp
|
Из папки проекта создайте новое приложение Angular, используя следующую команду:
|
1
|
ng new client
|
После создания client приложения перейдите в папку проекта и установите необходимые зависимости с помощью Node Package Manager (npm).
|
1
2
|
cd client
npm install
|
Запустите клиентский сервер, используя npm .
|
1
|
npm start
|
Вы должны запустить приложение по адресу http: // localhost: 4200 / .
Настройка приложения
Ваше угловое веб-приложение будет иметь корневой компонент. Создайте папку с именем root внутри папки src/app . Создайте файл с именем root.component.html и добавьте следующий HTML-код:
|
1
2
3
|
<h3>
Root Component
</h3>
|
Добавьте файл с именем root.component.ts и добавьте следующий код:
|
1
2
3
4
5
6
7
8
9
|
import { Component } from ‘@angular/core’;
@Component({
selector: ‘app-root’,
templateUrl: ‘./root.component.html’
})
export class RootComponent {
}
|
Удалите файлы app.component.html , app.component.ts , app.component.scss и app.component.spec.ts . У вас будет только один файл с именем app.module.ts внутри папки src/app .
Импортируйте RootComponent внутри файла app.module.ts .
|
1
|
import { RootComponent } from ‘./root/root.component’;
|
Включите RootComponent в ngModules и ngModules его.
|
01
02
03
04
05
06
07
08
09
10
11
|
@NgModule({
declarations: [
RootComponent
],
imports: [
BrowserModule,
FormsModule
],
providers: [],
bootstrap: [RootComponent]
})
|
Сохраните изменения и перезапустите сервер. RootComponent отображаться при загрузке приложения.
Вы будете использовать Angular Router для маршрутизации в нашем приложении для блогов. Поэтому импортируйте зависимости, связанные с маршрутизацией, в новый файл app.routing.ts внутри папки src/app .
|
1
2
|
import { RouterModule, Routes } from ‘@angular/router’;
import { ModuleWithProviders } from ‘@angular/core/src/metadata/ng_module’;
|
Определите маршрут маршрута вместе с компонентами, как показано:
|
1
2
3
|
export const AppRoutes: Routes = [
{ path: », component: LoginComponent }
];
|
Экспортируйте маршруты, чтобы создать модуль со всеми поставщиками маршрутов.
|
1
|
export const ROUTING: ModuleWithProviders = RouterModule.forRoot(AppRoutes);
|
Вот как выглядит файл app.routing.ts :
|
01
02
03
04
05
06
07
08
09
10
|
import { RouterModule, Routes } from ‘@angular/router’;
import { ModuleWithProviders } from ‘@angular/core/src/metadata/ng_module’;
import { LoginComponent } from ‘./login/login.component’;
export const AppRoutes: Routes = [
{ path: », component: LoginComponent }
];
export const ROUTING: ModuleWithProviders = RouterModule.forRoot(AppRoutes);
|
Как видно из приведенного выше кода, вы еще не создали LoginComponent . Это было добавлено ради ясности.
Импортируйте класс app.module.ts файл app.module.ts .
|
1
|
import { ROUTING } from ‘./app.routing’;
|
Включите его в импорт NgModule .
|
1
2
3
4
5
|
imports: [
BrowserModule,
ROUTING,
FormsModule
]
|
Поместите RouterOutlet на страницу root.component.html . Это где компонент маршрута визуализируется.
|
1
|
<router-outlet></router-outlet>
|
Создайте папку с именем login внутри папки src/app . Внутри папки login в login создайте файл с именем login.component.ts и добавьте следующий код:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
import { Component } from ‘@angular/core’;
@Component({
selector: ‘app-login’,
templateUrl: ‘./login.component.html’
})
export class LoginComponent {
constructor() {
}
}
|
Создайте файл с именем login.component.html и добавьте следующий код:
|
1
2
3
|
<h3>
Login Component
</h3>
|
Сохраните вышеуказанные изменения и перезагрузите сервер. В соответствии с маршрутами, определенными при загрузке LoginComponent будет отображаться LoginComponent .

Создание компонента входа
Вы уже заложили основу для LoginComponent при настройке приложения. Давайте создадим представление для LoginComponent используя Bootstrap .
Загрузите и включите стиль начальной загрузки CSS в папку assets и включите ссылку на страницу src/index.html .
|
1
|
<link rel=»stylesheet» type=»text/css» href=»./assets/bootstrap.min.css»>
|
Поместите оболочку вокруг app-root на страницу index.html .
|
1
2
3
|
<div class=»container»>
<app-root></app-root>
</div>
|
Добавьте следующий HTML- login.component.html страницу login.component.html .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
<form class=»form-signin»>
<h2 class=»form-signin-heading»>Please sign in</h2>
<label for=»inputEmail» class=»sr-only»>Email address</label>
<input name=»email» type=»email» id=»inputEmail» class=»form-control» placeholder=»Email address» required autofocus>
<label for=»inputPassword» class=»sr-only»>Password</label>
<input name=»password» type=»password» id=»inputPassword» class=»form-control» placeholder=»Password» required>
<div class=»checkbox»>
<label>
<input type=»checkbox» value=»remember-me»> Remember me
</label>
</div>
<button class=»btn btn-lg btn-primary btn-block» type=»button»>Sign in</button>
</form>
|
Создайте файл с именем login.component.css внутри папки login и добавьте следующий стиль CSS.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
.form-signin {
max-width: 330px;
padding: 15px;
margin: 0 auto;
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}
.form-signin .checkbox {
font-weight: 400;
}
.form-signin .form-control {
position: relative;
box-sizing: border-box;
height: auto;
padding: 10px;
font-size: 16px;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-signin input[type=»email»] {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.form-signin input[type=»password»] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
|
Измените декоратор @Component чтобы включить стиль CSS.
|
1
2
3
4
5
|
@Component({
selector: ‘app-login’,
templateUrl: ‘./login.component.html’,
styleUrls: [‘./login.component.css’]
})
|
Сохраните вышеуказанные изменения и попробуйте загрузить приложение. Вы будете иметь LoginComponent отображаемый в виде входа в систему.

Создание службы входа
LoginComponent необходимо будет взаимодействовать с базой данных, чтобы увидеть, является ли зарегистрированный пользователь действительным или нет. Так что для этого нужно будет делать вызовы API. Вы будете хранить часть взаимодействия с базой данных в отдельном файле с именем login.service.ts .
Создайте файл с именем login.service.ts и добавьте следующий код:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
import { Injectable } from ‘@angular/core’;
import { HttpClient } from ‘@angular/common/http’;
@Injectable()
export class LoginService {
constructor(private http: HttpClient){
}
validateLogin(){
}
}
|
Импортируйте LoginService в LoginComponent и добавьте его в качестве поставщика в декоратор компонента.
|
1
|
import { LoginService } from ‘./login.service’;
|
|
1
2
3
4
5
6
|
@Component({
selector: ‘app-login’,
templateUrl: ‘./login.component.html’,
styleUrls: [‘./login.component.css’],
providers: [ LoginService ]
})
|
Добавьте метод validateLogin в файл login.service.ts который будет выполнять вызов API. Вот как это выглядит:
|
1
2
3
4
5
6
|
validateLogin(user: User){
return this.http.post(‘/api/user/login’,{
username : user.username,
password : user.password
})
}
|
Как видно из приведенного выше кода, он возвращает наблюдаемую информацию, которая будет подписана в файле login.component.ts . Вот как login.service.ts файл login.service.ts :
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
import { Injectable } from ‘@angular/core’;
import { HttpClient } from ‘@angular/common/http’;
import { User } from ‘../models/user.model’;
@Injectable()
export class LoginService {
constructor(private http: HttpClient){
}
validateLogin(user: User){
return this.http.post(‘/api/user/login’,{
username : user.username,
password : user.password
})
}
}
|
Реализация проверки логина пользователя
Добавьте директиву ngModel к элементам ввода в login.component.html .
|
1
2
|
<input name=»email» [(ngModel)] = «user.username» type=»email» id=»inputEmail» class=»form-control» placeholder=»Email address» required autofocus>
<input name=»password» [(ngModel)] = «user.password» type=»password» id=»inputPassword» class=»form-control» placeholder=»Password» required>
|
Добавьте событие клика к кнопке входа.
|
1
|
<button class=»btn btn-lg btn-primary btn-block» (click)=»validateLogin();»
|
Вот как выглядит модифицированный login.component.html :
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
<form class=»form-signin»>
<h2 class=»form-signin-heading»>Please sign in</h2>
<label for=»inputEmail» class=»sr-only»>Email address</label>
<input name=»email» [(ngModel)] = «user.username» type=»email» id=»inputEmail» class=»form-control» placeholder=»Email address» required autofocus>
<label for=»inputPassword» class=»sr-only»>Password</label>
<input name=»password» [(ngModel)] = «user.password» type=»password» id=»inputPassword» class=»form-control» placeholder=»Password» required>
<div class=»checkbox»>
<label>
<input type=»checkbox» value=»remember-me»> Remember me
</label>
</div>
<button class=»btn btn-lg btn-primary btn-block» (click)=»validateLogin();»
</form>
|
Определите и инициализируйте пользовательскую переменную в файле login.component.ts .
|
1
2
3
4
5
|
public user : User;
constructor(private loginService: LoginService) {
this.user = new User();
}
|
Модель User была определена в папке src/app/models . Вот как это выглядит:
|
1
2
3
4
5
6
7
8
|
export class User {
constructor(){
this.username = »;
this.password = »;
}
public username;
public password;
}
|
Определите метод validateLogin который будет вызываться при нажатии кнопки. Вот как выглядит метод:
|
01
02
03
04
05
06
07
08
09
10
11
|
validateLogin() {
if(this.user.username && this.user.password) {
this.loginService.validateLogin(this.user).subscribe(result => {
console.log(‘result is ‘, result);
}, error => {
console.log(‘error is ‘, error);
});
} else {
alert(‘enter user name and password’);
}
}
|
Когда имя пользователя и пароль были введены, метод validateLogin подписывается на метод LoginService для проверки имени пользователя.
Вот как login.component.ts файл login.component.ts :
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import { Component } from ‘@angular/core’;
import { LoginService } from ‘./login.service’;
import { User } from ‘../models/user.model’;
@Component({
selector: ‘app-login’,
templateUrl: ‘./login.component.html’,
styleUrls: [‘./login.component.css’],
providers: [ LoginService ]
})
export class LoginComponent {
public user : User;
constructor(private loginService: LoginService) {
this.user = new User();
}
validateLogin() {
if(this.user.username && this.user.password) {
this.loginService.validateLogin(this.user).subscribe(result => {
console.log(‘result is ‘, result);
}, error => {
console.log(‘error is ‘, error);
});
} else {
alert(‘enter user name and password’);
}
}
}
|
Завершение
В этой части учебного пособия по Angular вы познакомились с тем, как начать создавать веб-приложение с помощью Angular. Вы создали базовую структуру приложения Angular и создали LoginComponent который позволит пользователю проверить имя пользователя и пароль.
В следующей части серии руководств вы напишите REST API для проверки логина пользователя и создадите домашний компонент.
Исходный код из этого урока доступен на GitHub .
Дайте нам знать ваши мысли и предложения в комментариях ниже.