Angular 2 может похвастаться улучшенным языком, усовершенствованными инструментами и обобщенными передовыми практиками. Лукас Руббелке внимательнее.
Angular 2 уже здесь, и это новый дивный мир! Благодаря улучшениям языка, инструментам, новым функциям браузера и лучшим практикам, почерпнутым из AngularJS 1.X, он превратился из фреймворка, который предоставляет нам в основном разумный подход к созданию веб-приложений, в полнофункциональную платформу, которую мы можем использовать для таргетинга. все. Angular 2 полностью эволюционировал, а это означает, что у каждого будет хотя бы один - если не много - моментов дезориентации, когда они изучают фреймворк.
В этой статье мы проведем экскурсию по простому веб-сайту Angular 2 и познакомимся с компонентами Angular и их работой. Под капотом большинства механизмов Angular 2 находится ванильный класс ES6, в котором Angular использует метаданные для расширения класса со всеми его возможностями. Мы будем использовать метаданные компонента, чтобы сообщить Angular, как должен себя вести класс.
В этой статье мы остановимся только на самом главном. Загляните в репозиторий и на прилагаемый к нему скринкаст, чтобы узнать о сокровищнице дополнительных советов и приемов.
Корневой компонент
Самая важная тема в Angular 2 - это компоненты. Это основные строительные блоки, на которых построено все остальное. В результате зарождение каждого приложения Angular 2 - это его «корневой» компонент. В теле нашего основного HTML-файла мы начинаем с одного элемента app, который является точкой входа для нашего приложения. Все внутри этого тега видно, пока Angular не загрузится.
// index.html <body> <app>Loading…</app> </body>
Чтобы запустить приложение, мы импортируем метод bootstrap из пакета platform-browser-dynamic. Также импортируем корневой компонент. Затем мы вызываем метод bootstrap, передавая корневой компонент и массив поставщиков.
// boot.ts import {bootstrap} from ‘@angular/platform-browserdynamic’; import {AppComponent} from ‘./app.component’; bootstrap(AppComponent, []);
Чтобы создать компонент, создайте класс TypeScript с именем AppComponent для представления компонента, а затем импортируйте класс Component из ядра Angular. Наконец, украсьте класс, добавив метаданные @Component и передав ему объект конфигурации.
Вы можете улучшить свой компонент, добавив к объекту config такие свойства, как selector (HTML-тег, представляющий компонент), шаблон и стили. Вы также можете указать массив поставщиков (например, услуг) и директив. Через мгновение мы повторим тот же процесс, когда создадим дочерний компонент.
Обратите внимание, что в Angular 2 считается лучшей практикой отдавать предпочтение мелкозернистым компонентам с одной конкретной задачей. Эмпирическое правило заключается в том, что вы достигли этого, когда ваш HTML-код достаточно мал, чтобы быть встроенным в декоратор, не будучи громоздким.
// app.component.ts import {Component} from ‘@angular/core’; @Component({ selector: ‘app’, styles: [ h1 { text-align: center; } ], template: <h1>Hello Angular 2!</h1> }) export class AppComponent {}
Вы найдете рабочий пример в ветке «01 -gettingstarted» репозитория GitHub.
Дочерние компоненты
Давайте создадим домашний компонент. Первое, что мы собираемся сделать, это создать наш класс HomeComponent и установить свойства title и body. Мы также импортируем Component из @ angular / core, чтобы мы могли использовать его для украшения нашего нового класса буквально за мгновение.
// home.component.ts import {Component} from ‘@angular/core’; export class HomeComponent { title: string = ‘Home Page’; body: string = ‘This is the about home body’; }
Мы собираемся улучшить наши метаданные Component с помощью селектора, который мы хотим использовать для нацеливания нашего компонента, пути к шаблону HTML и некоторого CSS для эстетических целей.
// home.component.ts import {Component} from ‘@angular/core’; @Component({ selector: ‘home’, template: require(‘./home.component.html’), styles: [ .content-card > .mdl-card__title { color: #fff; height: 176px; background: url(‘../images/home-card.jpg’) center / cover; } ] }) export class HomeComponent { title: string = ‘Home Page’; body: string = ‘This is the about home body’; }
Мы можем привязаться к любым общедоступным свойствам или методам в нашем классе TypeScript, поэтому в нашем файле home.component.html мы будем использовать интерполяцию строки фигурных скобок для визуализации нашего title и body.
// home.component.html <div class=”content-card”> <div class=”mdl-card__title”> <h1>{{ title }}</h1> </div> <div> {{ body }} </div> </div>
Мы можем повторить этот процесс для ItemsComponent и AboutComponent, а затем сделать все три наших недавно созданных дочерних компонента доступными для AppComponent, импортировав их и вводя их через массив директив в метаданных класса.
// app.component.ts import {Component} from ‘@angular/core’; import {AboutComponent} from ‘./about/about.component’; import {ItemsComponent} from ‘./items/items.component.ts’; import {HomeComponent} from ‘./home/home.component’; @Component({ selector: 'app', template: require('./app.component.html'), styles: [require('./app.component.css')], directives: [HomeComponent, AboutComponent, ItemsComponent] }) export class AppComponent {}
Компоненты Angular 2 по своей природе являются самодостаточными, поэтому, когда мы хотим отобразить их на странице, нам просто нужно добавить наши селекторы компонентов в разметку, как вы можете видеть ниже. Приятным побочным эффектом этой компонентно-управляемой архитектуры является то, что наш HTML теперь является DSL и очень хорошо описывает модель предметной области, в которой мы работаем.
// app.component.html <main> <div> <home></home> <about></about> <items></items> </div> </main>
Если вы посмотрите ветку репозитория «02 -components», вы увидите рабочий пример этого.
Маршрутизация
Создание группы компонентов и размещение их на странице интересно, но не обязательно отражает то, как мы создаем приложения в реальной жизни. Нам необходимо иметь возможность перемещаться между компонентами, как если бы они были страницами на веб-сайте, и мы можем использовать ComponentRouter для выполнения этой задачи.
Мы собираемся немного обновить наш файл boot.ts, импортировав ROUTER_PROVIDERS из пакета маршрутизатора Angular. Затем мы вставим ROUTER_PROVIDERS в массив поставщиков при вызове метода bootstrap.
// boot.ts import {bootstrap} from ‘@angular/platform-browserdynamic’; import {ROUTER_PROVIDERS} from ‘@angular/router’; import {AppComponent} from ‘./app.component’; bootstrap(AppComponent, [ ROUTER_PROVIDERS ]);
Поскольку это небольшое приложение, мы собираемся настроить наши маршруты в корневом компоненте. Мы начнем с импорта декоратора Routes и ROUTER_DIRECTIVES из пакета маршрутизатора Angular. Нам нужны ROUTER_DIRECTIVES, если мы хотим создавать ссылки на наши маршруты в нашем HTML.
//app.component.ts import {Component} from ‘@angular/core’; import {Routes, ROUTER_DIRECTIVES} from ‘@angular/ router’; import {AboutComponent} from ‘./about/about.component’; import {ItemsComponent} from ‘./items/items.component.ts’; import {HomeComponent} from ‘./home/home.component’; @Component({ selector: ‘app’, template: require(‘./app.component.html’), styles: [require(‘./app.component.css’)], directives: [ROUTER_DIRECTIVES] }) @Routes([ {path: ‘/’, component: HomeComponent}, {path: ‘/home’, component: HomeComponent}, {path: ‘/about’, component: AboutComponent}, {path: ‘/items’, component: ItemsComponent}, {path: ‘/*’, component: HomeComponent} ]) export class AppComponent {}
Затем мы украсим наш компонент приложения некоторыми дополнительными метаданными @Routes, которые содержат таблицу маршрутизации для нашего приложения. Базовый маршрут - это объект, состоящий из пути и компонента, на который указывает путь.
Вы заметили маршруты ‘/’ и ‘/ *’? Первый соответствует корневому URL-адресу приложения (http://example.com) и обслуживает HomeComponent, а второй соответствует любым незарегистрированным URL-адресам и обслуживает HomeComponent.
Теперь, когда наши маршруты настроены, мы можем обновить наши шаблоны, чтобы они ссылались на определенные маршруты. Чтобы связать зарегистрированный маршрут в HTML-коде компонента, мы поместим атрибут [routerLink] в тег привязки.
Значение должно быть массивом путей. В данном случае, поскольку у нас нет дополнительных параметров, нам нужен только один путь (который мы указали в оформлении @Routes).
// app.component.html <header> <div> <nav> <a [routerLink]=”[‘/home’]”>HOME</a> <a [routerLink]=”[‘/about’]”>ABOUT</a> <a [routerLink]=”[‘/items’]”>ITEMS</a> </nav> </div> </header> <main> <div> <router-outlet></router-outlet> </div> </main>
Если вы заглянете в ветку репозитория «03 -routes», вы увидите нашу таблицу маршрутизации в действии.
В заключение
Все сложные системы просто состоят из группы более мелких систем, которые работают вместе, чтобы произвести что-то впечатляющее. Angular 2 невероятно мощный, и из-за этого может казаться, что мы стоим у подножия утеса, пытаясь понять, как мы собираемся добраться до вершины.
Процесс становится гораздо менее пугающим, когда мы понимаем, что просто работаем с компонентами, которые можно исключить, используя простой процесс создания класса, импорта наших зависимостей, украшения нашего класса, улучшения нашего компонента и повторения с самого начала.
Лукас Руббелке - энтузиаст технологий и автор AngularJS в действии. Его любимое занятие - так же увлекать людей новыми технологиями, как и он сам.
Эта статья впервые появилась в 282-м выпуске сетевого журнала