Angular — это фреймворк для создания сложных динамических веб-приложений. По своей сути Angular позволяет разработчикам создавать инновационные, масштабируемые и простые в обслуживании приложения. В этой статье мы углубимся в Angular и основные концепции, которыми вы, как новичок, так и опытный разработчик, должны овладеть, чтобы использовать весь потенциал Angular. Мы рассмотрим компоненты, сервисы, директивы, внедрение зависимостей и хорошие шаблоны.
Давайте подробнее рассмотрим каждый из них:
Компоненты
Компоненты — это самые основные строительные блоки приложения Angular. Они представляют собой часть пользовательского интерфейса, такую как верхний и нижний колонтитулы или область основного содержимого. Вот пример простого компонента в Angular:
import { Component } from '@angular/core'; @Component({ selector: 'app-header', template: ` <header> <nav> <a routerLink="/home">Home</a> <a routerLink="/about">About</a> <a routerLink="/contact">Contact</a> </nav> </header> ` }) export class HeaderComponent { }
В этом примере мы сначала импортируем модуль Component из ядра Angular. Затем мы используем декоратор @Component, чтобы определить наш компонент. Свойство selector указывает имя компонента, а свойство template указывает HTML-код, который должен отображаться на экране.
Услуги
Службы — это способ обмена данными и функциями между компонентами. В Angular службы отвечают за вызовы API, обработку вычислений, управление состоянием и обмен данными.
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class DataService { constructor(private http: HttpClient) { } getData() { return this.http.get('https://api.example.com/data'); } }
Сначала мы импортируем модуль Injectable из ядра Angular и модуль HttpClient для выполнения вызовов API. Затем мы используем декоратор @Injectable, чтобы определить наш сервис. Свойство createdIn указывает, что эта служба должна быть доступна для всего приложения.
Затем мы определяем конструктор, который принимает HttpClient в качестве параметра. Это позволяет нам совершать вызовы API из нашего сервиса. Наконец, мы определяем метод getData(), который использует HttpClient для получения данных из API.
Директивы
Директивы — это способ добавить пользовательское поведение к элементу DOM. Их можно использовать для таких задач, как скрытие или отображение элементов, добавление стилей или добавление прослушивателей событий. Вот пример простой директивы в Angular:
import { Directive, ElementRef, Renderer2 } from '@angular/core'; @Directive({ selector: '[appHighlight]' }) export class HighlightDirective { constructor(private el: ElementRef, private renderer: Renderer2) { this.renderer.setStyle(this.el.nativeElement, 'background-color', 'yellow'); } }
В этом примере мы сначала импортируем модули Directive, ElementRef и Renderer2 из ядра Angular. Затем мы используем декоратор @Directive, чтобы определить нашу директиву. Свойство selector указывает имя директивы, которую можно использовать в HTML для применения пользовательского поведения.
Затем мы определяем конструктор, который принимает ElementRef и Renderer2 в качестве параметров. ElementRef позволяет нам получить доступ к элементу DOM, к которому прикреплена директива, а Renderer2 позволяет нам манипулировать элементом DOM.
В этом примере мы используем средство визуализации, чтобы установить желтый цвет фона элемента DOM. Таким образом, всякий раз, когда эта директива применяется к элементу, он становится желтым.
Внедрение зависимости
Внедрение зависимостей — это мощная функция Angular, которая позволяет компонентам и службам получать доступ к общим данным, хранящимся в службах, без необходимости их непосредственного создания. Это упрощает написание модульного повторно используемого кода и тестирование отдельных частей приложения. Вот пример компонента, использующего сервис с внедрением зависимостей:
import { Component } from '@angular/core'; import { DataService } from './data.service'; @Component({ selector: 'app-home', template: ` <h2>Home Page</h2> <p>{{ data }}</p> ` }) export class HomeComponent { data: any; constructor(private dataService: DataService) { this.data = this.dataService.getData(); } }
В этом примере мы импортируем модуль Component из ядра Angular и DataService из нашего компонента. Затем мы используем декоратор @Component, чтобы определить наш компонент. Свойство selector и свойство template аналогичны нашему предыдущему примеру компонента.
Далее мы определяем конструктор, который принимает DataService в качестве параметра. Делая это, мы можем использовать DataService внутри нашего компонента, не создавая его напрямую. В этом примере мы используем метод getData() из нашего DataService для получения данных и их отображения на экране.
Хорошие узоры:
Презентация против компонентов контейнера
Шаблон «контейнер против компонента представления» в Angular относится к разделению обязанностей между двумя типами компонентов: компонентами представления и компонентами-контейнерами.
Компонент представления ориентирован на визуальное представление данных и отвечает за отображение информации пользователю. Обычно он получает данные через входы и часто не имеет состояния.
import { Component, Input } from '@angular/core'; @Component({ selector: 'app-display-data', template: ` <p>{{ data }}</p> ` }) export class DisplayDataComponent { @Input() data: any; }
Компонент-контейнер, с другой стороны, связан с управлением данными и состоянием приложения. Он предоставляет данные компоненту представления через выходные данные и часто имеет состояние.
import { Component } from '@angular/core'; @Component({ selector: 'app-container', template: ` <app-display-data [data]="data"></app-display-data> ` }) export class ContainerComponent implements OnInit { data = ''; constructor(private dataService: DataService) { } ngOnInit { this.data = this.dataService.getData(); } }
В этом примере ContainerComponent отвечает за выборку управления данными и состоянием приложения и предоставление их DisplayDataComponent посредством ввода данных. DisplayDataComponent фокусируется только на визуальном представлении данных и отображает их пользователю. Этот шаблон позволяет лучше разделить проблемы и упрощает поддержку и тестирование приложения. Кроме того, компоненты контейнера отвечают за выборку данных из служб для предоставления компонентам представления.
Разделив обязанности приложения Angular на компоненты представления и контейнера, его становится проще поддерживать и тестировать. Это связано с тем, что каждый компонент имеет четкую и единую ответственность, что снижает риск тесно связанного и сложного кода. Этот шаблон также поддерживает модульность, упрощая понимание и разработку приложения в целом.
Таким образом, шаблон «контейнер против компонента представления» в Angular является полезным способом структурирования приложения за счет разделения обязанностей компонентов и обеспечения модульности, удобства обслуживания и тестируемости.
Разделение ответственности с помощью сервисов
В Angular различие между сервисом и компонентом определяется обязанностями кода. Службы служат арбитрами общих, независимых от компонентов данных и управления состоянием, выполняя такие обязанности, как вызовы API, управление преобразованием данных и обмен данными между компонентами.
И наоборот, компоненты воплощают визуальное представление данных и определяют способ отображения информации для пользователя. Кроме того, компоненты обрабатывают взаимодействия с пользователем, такие как отправка форм и нажатие кнопок, и снабжены логикой, необходимой для манипулирования данными, предоставляемыми службами.
По сути, код, который управляет общими, независимыми от компонентов данными и состоянием, принадлежит службе, а код, отвечающий за визуальное представление и взаимодействие с пользователем, принадлежит компоненту. Такое четкое разделение обязанностей обеспечивает ясность с точки зрения разделения задач и облегчает обслуживание и тестирование приложения.
Пример DataService, использованный в предыдущем примере, может выглядеть следующим образом.
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class DataService { constructor(private http: HttpClient) {} getData() { return this.http.get('https://api.example.com/'); } }
Заключение
Angular — это мощная платформа, которая предлагает широкий спектр функций для создания динамических и интерактивных веб-приложений. Понимая компоненты, службы, директивы, внедрение зависимостей и несколько хороших шаблонов, вы будете на пути к тому, чтобы стать экспертом по Angular.
Если вы нашли это введение в Angular, пожалуйста, дайте мне несколько аплодисментов. Это действительно помогает мне!
Удачного кодирования!
Сценарист: Лэндон Баттарс