Увидев последнюю NG-Conf, я подумал, что сейчас самое время начать изучать Angular2. После долгого пути Angular2 наконец вышел из стадии бета-тестирования. Это больше не была непонятная среда, в которой каждая новая функция могла заставить вас переписать приложение.
Она стабильна, работает быстро, а документация содержит действительно полезную информацию и руководства.
Мало того, TypeScript казался первым в команде Angular вариантом для создания новых приложений. TypeScript - это типизированный надмножество JavaScript, которое компилируется в простой JavaScript. Это означает, что вы можете использовать функции ES2015 (бывший ES6) или новее и скомпилировать его в более старую версию EcmaScript, чтобы он мог работать в старых версиях браузеров.
Пора тоже изучить TypeScript.
Цель сообщения в блоге - создать очень простое приложение для задач Angular2 с использованием TypeScript и Firebase с использованием библиотеки AngularFire2.
Когда начать
Я разработчик Angular 1.x уже 2 года, и вы можете подумать, что это огромное преимущество по сравнению с тем, кто никогда раньше не использовал этот фреймворк.
Нет.
Некоторые ключевые функции остаются такими, как директивы, службы, внедрение зависимостей, но Angular2 настолько отличается от Angular1, что вы можете сразу перейти к нему.
редактор
Первое, что вам нужно сделать, это настроить свою среду, и выбор правильного редактора является ключевым. До сегодняшнего дня я предпочитал Sublime Text. Супер легкий, множество конфигураций, фрагментов и отличный менеджер пакетов.
Хотя, чтобы начать с TypeScript, я остановился на Visual Studio Code. Поскольку TypeScript разрабатывается и поддерживается Microsoft, использование инструмента Microsoft может быть лучшим решением, поскольку теоретически он должен быть первым обновленным для поддержки последних изменений TypeScript.
Если вы, как и я, привыкли к ОС на базе unix, установка Visual Studio Code может показаться немного неудобной, но я должен сказать, что мне это очень понравилось. А еще есть готовые отрывки из Джона Папы.
Создать проект
После запуска и настройки вашего любимого редактора давайте создадим наше первое приложение Angular2. И это так же просто, как установить Angular CLI (вам понадобится NodeJS).
$ npm install -g angular-cli
и запустите на терминале следующую команду:
$ ng new ng2todo
После этого был создан шаблон приложения Angular2 с именем «ng2todo», и вы можете запустить его, войдя в папку приложения и запустив локальный веб-сервер.
$ cd ng2todo $ ng serve
Перейдите по адресу http: // localhost: 4200 и проверьте свое первое приложение Angular2.
Сделанный! Легко, правда? :)
Хорошо, давайте посмотрим, сможем ли мы узнать что-нибудь реальное и внести первые изменения в наше приложение. Перейдите к компоненту приложения (src / app / ng2todo.component.ts) и измените заголовок на «ng2todo list».
Неплохо, но теперь я покажу вам, как создать компонент с нуля и добавить еще несколько функций в наше приложение.
Структура папки
Взгляните на структуру папок приложения.
Я не буду вдаваться в подробности о назначении каждой папки, но посмотрите это видео, если вы хотите узнать о нем больше.
Внутри каталога src находится ваше приложение, а внутри каталога app находится ваш компонент приложения (ng2todo). Внутри этого каталога есть еще одна папка с именем shared, в которой вы можете создавать все свои компоненты, службы и т. Д., Но лично я предпочитаю создавать их внутри каталога app, поэтому я просто сниму. Опять же, это личное дело каждого, вы можете оставить общую папку, если хотите.
Компонент Todos
Давайте создадим наш первый компонент, и вместо того, чтобы делать все вручную, мы воспользуемся мощью Angular CLI.
$ ng generate component todos
И это все! Он автоматически создает папку с компонентом, шаблоном, стилями, зависимостями внедрения и файлом спецификации для тестов! Как это круто ?!
Внутри шаблона (todos.component.html) создайте неупорядоченный список и с помощью директивы NgFor переберите список задач и создайте элемент списка для каждого из них.
<ul> <li *ngFor=”let todo of todos”> <span>{{todo}}</span> </li> </ul>
Внутри компонента создайте список задач типа any, а внутри функции ngOnInit давайте заполним список, используя некоторый псевдокод.
todos: any[]; constructor() {} ngOnInit() { this.todos = [‘Learn Angular2’, ‘Check AngularFire2’, ‘Fav this article’]; }
Теперь давайте добавим созданный элемент app-todos в шаблон приложения (src / app / ng2todo.component.html), чтобы отобразить массив
<h1> {{title}} </h1> <app-todos></app-todos>
Но компонент приложения по-прежнему не знает, что такое app-todos, поэтому нам нужно импортировать компонент todos. Итак, в компоненте приложения (src / app / ng2todo.component.ts) давайте добавим следующую строку сверху
import { TodosComponent } from ‘./todos/todos.component’;
Добавление новых задач
Прежде чем переходить к AngularFire, давайте добавим функцию для добавления новых элементов в список.
В компоненте задач добавьте поле ввода с директивой NgModel. Эта директива дает нам двустороннюю привязку данных.
Мы также будем использовать обработчик событий keypress.enter, чтобы добавить вставленное значение в список после нажатия клавиши Enter. .
<h3>Add new todo:</h3> <input type=”text” [(ngModel)]=”newTodo” (keydown.enter)=”add()” />
В компоненте создайте функцию add ()
add() { this.todos.push(this.newTodo); this.newTodo = ‘’; }
Не забудьте объявить и инициализировать свойство newTodo прямо перед конструктором.
newTodo: string = ‘’;
Проверьте приложение на http: // localhost: 4200 и попробуйте. Для идеального сообщения в блоге мы должны создать тесты, прежде чем вносить какие-либо изменения в код, но я оставлю это для другой статьи.
Сохранять данные на Firebase
Сейчас список приложений находится только в памяти, если вы обновите веб-страницу, вы потеряете все свои изменения. В этой статье я покажу вам, как использовать Firebase для сохранения ваших данных с помощью AngularFire2, библиотеки, которая объединяет наблюдателей Firebase в реальном времени и аутентификацию с Angular2.
Firebase - это серверная часть как служба, которая предлагает вам базу данных NoSQL , сервис аутентификации, аналитика и хостинг, все в одном.
Установить и ввести
Сначала установите AngularFire2 и Firebase (v2) как зависимости приложения.
$ npm install angularfire2 [email protected] — save
Чтобы получить автозаполнение Firebase, вам может потребоваться установить его типизации:
$ typings dt~firebase — global — save
Затем нам нужно сообщить Angular, что мы хотим использовать поставщиков и сервисы Firebase, поэтому мы загрузим его в файл main.ts. Здесь мы также зададим URL-адрес нашего приложения Firebase, а также провайдер аутентификации и метод. Не обращайте внимания на URL-адрес функции defaultFirebase, вам придется изменить его, но я расскажу об этом позже в этой статье.
И, как обычно, нам также нужно импортировать модули вверху.
import { FIREBASE_PROVIDERS, defaultFirebase, firebaseAuthConfig, AuthProviders, AuthMethods } from ‘angularfire2’; … bootstrap(Ng2todoAppComponent, [ FIREBASE_PROVIDERS, defaultFirebase(‘https://ng2tododb.firebaseio.com/'), firebaseAuthConfig({ provider: AuthProviders.Anonymous, method: AuthMethods.Anonymous }) ]);
Angular CLI
Если вы проверите свое приложение сейчас, в консоли браузера появятся ошибки, касающиеся некоторых файлов, которые не могут быть найдены (angularfire2). Это потому, что Angular CLI требует дополнительной настройки, чтобы получить нужные файлы.
Откройте файл angular-cli-build.json (вы можете найти его в корневом каталоге вашего приложения) и добавьте недостающие строки, чтобы получить файлы firebase и angularfire2.
module.exports = function(defaults) { return new Angular2App(defaults, { vendorNpmFiles: [ ‘systemjs/dist/system-polyfills.js’, … ‘firebase/lib/*.js’, ‘angularfire2/**/*.+(js|js.map)’ ] }); };
Это позволяет получить все упомянутые файлы и добавить их в каталог ”dist / vendor”.
Теперь нам также нужно сопоставить файлы в пакетах конфигурации системы CLI внутри файла system-config.ts. Изменяйте только там, где написано «Конфигурация пользователя».
/** Map relative paths to URLs. */ const map: any = { ‘firebase’: ‘vendor/firebase/lib/firebase-web.js’, ‘angularfire2’: ‘vendor/angularfire2’ }; /** User packages configuration. */ const packages: any = { ‘firebase’: { format: ‘cjs’ }, ‘angularfire2’: { format: ‘cjs’, defaultExtension: ‘js’, main: ‘angularfire2.js’ } };
Создайте свой аккаунт Firebase
К моменту написания этой статьи (первоначально 25 мая) Firebase v3 уже был выпущен, но AngularFire2 работал только с Firebase v2. Это означает, что вам необходимо создать учетную запись с помощью устаревшей консоли. Я считаю, что AngularFire2 скоро будет обновлен для работы с Firebase v3, но пока это единственный способ заставить его работать.
Внутри вашей учетной записи создайте новое приложение. В моем случае я дал ему имя «ng2tododb», но вы можете называть его как хотите. Не забудьте изменить URL-адрес приложения Firebase в методе начальной загрузки (внутри main.ts).
Аутентификация
Вы также можете использовать свою учетную запись Google, Facebook, Twitter или Github или регистрировать пользователей, используя адрес электронной почты и пароль. Но чтобы упростить эту задачу, мы разрешим анонимную аутентификацию для внесения изменений в наше приложение Firebase.
В консоли Firebase нажмите Управление приложением, чтобы войти в панель управления только что созданного приложения. Перейдите к параметру «Вход и аутентификация» слева и на вкладке «Анонимный» установите флажок Включить аутентификацию анонимного пользователя.
Теперь в компоненте приложения импортируйте модуль аутентификации Firebase из AngularFire2,
import { FirebaseAuth } from ‘angularfire2’;
и выполните вход внутри конструктора компонента приложения.
export class Ng2todoAppComponent { title = ‘ng2todo list’; constructor (private _auth: FirebaseAuth) { this._auth.login(); } }
Чтение данных из Firebase
Вместо того, чтобы хранить наш список задач внутри массива в памяти, давайте свяжем его с Firebase.
В нашем компоненте задач нам понадобится AngularFire,
import { AngularFire } from ‘angularfire2’;
вставить его в конструктор компонента,
constructor(private af: AngularFire) {}
а затем установите наш список задач следующим образом внутри функции ngOnInit:
this.todos = this.af.database.list(‘/’);
Если ваш редактор настроен правильно, вы можете увидеть некоторые красные волнистые линии на этой конкретной строке.
Это происходит из-за мощи TypeScript, который видит, что тип данных, возвращаемых функцией list, отличается от текущего типа данных переменной todos (которая является массив типа любой).
Прямо сейчас список todos - это массив, который живет в памяти, и мы хотим воспользоваться преимуществами Firebase и настроить трехстороннюю привязку данных (между DOM, компонентом и базой данных ), поэтому нам нужно изменить переменную todos на массив, который изменяется со временем (наблюдаемый). В этом случае наш список задач будет иметь тип FirebaseListObservable.
Итак, вверху добавьте его к модулям, импортированным из angularfire2,
import { AngularFire, FirebaseListObservable } from ‘angularfire2’;
и измените тип переменной todos.
todos: FirebaseListObservable<any[]>;
Осталось сделать еще одно изменение. Если вы перейдете к шаблону, мы будем использовать директиву NgFor, которая выполняет итерацию по массиву, который находится в памяти, а не во времени. Итак, нам нужно передать директиву асинхронной операции.
<li *ngFor=”let todo of todos | async”> <span>{{todo.$value}}</span> </li>
Angular AsyncPipe - интересный пример нечистого канала. AsyncPipe принимает Promise или Observable в качестве входных данных и автоматически подписывается на входные данные, в конечном итоге возвращая выданные значения.
Еще одно изменение, которое необходимо сделать, - вместо привязки к "todo" внутри элемента span, привязать его к "todo. $ Value" . Это свойство Firebase, которое возвращает значение объекта.
Теперь вы можете открыть два окна бок о бок и увидеть его в действии!
Добавить в firebase
Как видите, мы не внесли никаких изменений в добавление нового элемента в Firebase, функция add () осталась прежней. Это простой толчок.
Удалить
Давайте изменим наше приложение, чтобы мы могли удалить его из записи из Firebase. В нашем шаблоне добавьте «x» перед каждой записью и привяжите событие щелчка для вызова функции с именем delete, которая будет иметь задачу в качестве аргумента.
<span>{{todo.$value}}</span> <span (click)=”delete(todo)”>[x]</span>
Теперь в нашем компоненте нам нужно создать функцию удаления.
delete(todo) { this.todos.remove(todo); }
TypeScript и Angular2 сильно эволюционировали в прошлом году, они объединились в этом путешествии, и действительно кажется, что у них есть все на их стороне, чтобы продвигать будущее разработки веб-приложений.
Пока еще рано говорить, но судя по тому, что мы видим на данный момент, это действительно многообещающе.
Если у вас есть какие-либо вопросы, вы можете связаться со мной в Twitter или Github, я позабочусь о том, чтобы не оставить вас без ответа.
Кроме того, это приложение доступно в моей учетной записи Github, так что не стесняйтесь его разветвлять или загружать.
Если вам это нравится и вы хотите увидеть больше статей этого типа и узнать больше об Angular2, проявите некоторую любовь, порекомендовав и поделившись.
Ваше здоровье!