Angular 2.0.0-alpha для тех, кто не в силах ждать
Совсем недавно (5–6 марта) прошла конференция ng-conf, и много докладов на ней было посвящено грядущему релизу Angular 2, на нескольких из них даже показали альфа версию. Конечно же после прослушивания очень захотелось опробовать его лично. Если вам тоже не терпится — прошу под кат.В этой статье мы разберёмся, где взять билд альфа версии Angular 2.0, создадим на нём небольшое приложение — To-do list, и запустим его в браузере без полной поддержки ECMAScript 6.Angular 2 очень сильно отличается от нынешней версии, переосмыслено практически всё. Многие из отличий вытекают из того, что он на всю катушку использует ES6 с аннотациями и типами, разработчики называют этот язык AtScript. Теперь же, судя по всему, команда Angular начала плотно сотрудничать с Microsoft и разработка будет вестись на TypeScript, и после выхода его версии 1.5, туда будет полностью включен AtScript.
Приложение Angular 2 теперь состоит из компонентов и представляет из себя их дерево. Идея похожа на Web-components, даже разметка Angular 2 компонентов помещается в Shadow DOM. Причём если вы соберётесь использовать в своём приложении Web-components, или, например, Polymer — то синтаксис ничем не будет отличаться от использования ваших собственных Angular 2 компонентов. Сами компоненты представляют из себя ES6 классы с аннотациями, никакого специального синтаксиса как, например, для директив в версии 1.х не требуется. Сервисы теперь тоже стали обычными классами, а благодаря поддержке типизации в AtScript, инъектировать их можно по типу, без использования синтаксиса .$inject или ngAnnotate.
Давайте сейчас попробуем создать наше первое To-do приложение и по ходу дела разберёмся, что да как.
На сегодня ни один браузер не поддерживает весь тот функционал, который нужен Angular 2 для работы, поэтому нам понадобится целый ворох инструментов:
Чтобы всем желающим пощупать альфу не приходилось ставить это всё по-отдельности, разработчики собрали quick start. Его можно установить набрав в папке проекта git clone https://github.com/angular/quickstart.git Теперь все необходимое лежит у нас в папке quickstart, а для красоты добавим ещё angular-material, но использовать из него будем, разумеется, только css bower install angular-material Теперь создадим в проекте файл index.html
To do app is loading…
Теперь создадим папку app и положим в неё файл App.js
import {Component, Template, bootstrap, Foreach} from 'angular2/angular2'; import {TodoStore} from 'app/TodoStore'; import {ItemEditor} from 'app/ItemEditor';
@Component ({ selector: 'app', componentServices: [ TodoStore ] }) @Template ({ url: 'app/todo.html', directives: [Foreach, ItemEditor] }) class App { constructor (store: TodoStore) { this.store=store; } }
bootstrap (App); Сначала мы импортируем классы Component, Template, Foreach из angular2.js, оттуда же импортируем функцию bootstrap, уже знакомую тем, кто в версии 1.x не использует директиву ng-app, она инициализирует главный компонент приложения, следом мы импортируем классы TodoStore из app/todoStore.js (это будет сервис, отвечающий за работу со списком задач и его хранение в localStorage браузера) и ItemEditor из app/item-editor.js (это будет компонент — директива, отображающий элемент списка). Мы их пока не написали, поэтому рассмотрим их позже.Далее мы создаём класс App, ему в конструктор при помощи инъектора передаётся объект класса TodoStore, который мы присваиваем свойству store.
При объявлении класса мы использовали аннотации Component и Template из angular2.js: Component — аннотация, которая и делает класс компонентом. Свойство selector — это селектор, позволяющий обнаружить элемент в разметке шаблона, у нас это элемент app. Свойство componentServices — это список классов для инъектора.Template — помогает указать для компонента шаблон. Свойство url указывает путь, где будет находиться шаблон, свойство directives указывает список директив, которые используются в разметке этого шаблона.В конце файла мы используем функцию bootstrap, чтобы инициализировать наш главный компонент.
Давайте теперь создадим файл app/TodoStore.js
export class TodoStore { constructor () { this.load (); } save () { window.localStorage['todoItems']=JSON.stringify (this.items); } addItem (name, checked) { this.items.push (new Item (name, checked)); } clear () { this.items.length=0; } load () { this.items=[]; let that=this; let itemsStr=window.localStorage['todoItems']; if (itemsStr) { JSON.parse (itemsStr).forEach ((e) => { that.addItem (e.name, e.checked); }); } } }
class Item { constructor (name, checked){ this.name = name; this.checked=checked || false; } toggleCheck () { this.checked=! this.checked; } } У класса TodoStore есть методы save (), load (), clear (), и addItem (name, checked).Сам список задач будет храниться в свойстве items. Метод save () сохраняет значение свойства items в localStorage. Метод clear () очищает свойство items. Метод load () загружает из localStorage все элементы списка и добавляет их в items с помощью метода addItem. Метод addItem (name, checked) принимает имя пункта списка, создаёт новый объект Item и добавляет его в Items.
Следом идёт объявление класса Item, конструктор принимает name — имя пункта списка и checked — отмечен ли он как выполненный. Ещё у класса есть метод toggleCheck (), который меняет значение checked на противоположное.
Далее создаём файл app/todo.html с шаблоном главного компонента
To do list
import {Component, Template} from 'angular2/angular2';
@Component ({
selector: 'item-editor',
bind: {
'item': 'item'
}
})
@Template ({
inline: `
} Здесь в @Component мы указали селектор 'item-editor', это элемент, который используется в *foreach в todo.html. Следом указано свойство bind, оно указывает, что нужно привязать значение атрибута item к свойству item класса компонента (что-то вроде bindToController).В @Template на этот раз вместо url для примера указано свойство inline, оно служит для указания текста шаблона прямо в коде. Это снижает количество требуемых http запросов, поэтому после выхода Angular 2 скорее всего появится кокой-нибудь плагин для Gulp, который будет менять url на inline, на замену нынешнему gulp-angular-templatecache.
В самом шаблоне можно увидеть атрибут [class.md-checked] — это лаконичная замена ng-class. А ниже выводится имя элемента списка с помощью уже ставшего родным синтаксиса с фигурными скобками {{item.name}}.
Вот и всё, теперь можно запустить проект (проверял только в Хроме) и посмотреть, как работает будущий Angular 2.0.
Как мы видим, разработчики полностью переосмыслили концепцию Angular.js и нас теперь ждёт абсолютно новый фреймворк с новым, более лаконичным синтаксисом. Благодаря абсолютно новой архитектуре, созданной с расчётом на большие приложения, производительность рендеринга, главный бич версий 1.x, возрастает во много раз (наглядное сравнение можно посмотреть в конце доклада Дейва Смита Angular + React = Speed). Возможность использовать типизацию открывает перспективы развития IDE для продвинутой поддержки дополнения кода и статического анализа (как минимум, Microsoft заявляет поддержку Angular в Visual Studio одним из приоритетов). А новшества ES6 сделают разработку ещё быстрее и приятнее.
Это практически и всё, что мне удалось узнать об Angular 2.0 на сегодня, будем дальше следить за новостями, а пока вот несколько и интересных ссылок по теме: Канал ng-conf на YouTube с массой интересных докладовОфициальный сайт Angular 2.0Проект Angular 2 на GitHub