Angular 2 — это мощная и полнофункциональная среда, которую вы можете использовать для создания лучших веб-приложений. Созданный с учетом TypeScript, Angular 2 использует преимущества футуристических функций языка, таких как декораторы и интерфейсы, которые делают кодирование быстрее и проще.
В этом видео из моего курса « Современные веб-приложения с Angular 2» я покажу вам, как использовать Angular 2 для создания службы, которая будет взаимодействовать с сервером. Обратите внимание, что в этом видео мы строим код из предыдущих курсов, и вы можете найти полный исходный код курса на GitHub .
Как создать сервис Angular 2
Как создать сервис проекта
До сих пор мы создавали приложение для управления проектами. Прямо сейчас проекты, которые мы показываем пользователю, просто жестко запрограммированы прямо в компоненте наших проектов. Однако это не долгосрочное решение. Мы хотим получить какой-то способ получения списка проектов с нашего сервера. Итак, в этом видео мы собираемся создать сервис проекта.
В Angular сервис — это, по сути, любой набор функций, который мы хотим сделать доступным для нескольких компонентов. Это простой способ обернуть некоторые функции. Итак, внутри нашего каталога приложений, давайте создадим сервис проектов. И мы будем называть это projects.service.ts
.
Теперь, конечно, сервис не является компонентом, поэтому нет необходимости импортировать декоратор компонента. Но есть еще один декоратор, который нам нужен, и это Injectable
. Итак, давайте импортируем Injectable
из angular/core
. Как я уже сказал, Injectable
— это декоратор, и он не принимает никаких свойств. Поэтому мы просто вызовем Injectable
, а затем экспортируем наш класс. Мы назовем класс ProjectsService
.
Injectable
делает этот класс тем, что Angular может использовать для внедрения зависимостей. Как мы увидим чуть позже, мы используем внедрение зависимостей, чтобы получить экземпляр этой службы проекта в компоненте, который использует службу проекта. Очередь Angular использует внедрение зависимостей таким образом, что она может легко внедрить фиктивные сервисы и тому подобное, если вы хотите протестировать свои компоненты.
Добавить методы в сервис
Итак, давайте продолжим и добавим некоторые методы в наш ProjectsService
здесь. Прежде всего нам понадобится модуль Http
который есть в Angular. Это позволит нам делать запросы напрямую на сервер. Итак, давайте импортируем Http
, и мы также импортируем класс ответа, который нам понадобится для проверки некоторых типов. И оба они происходят от @angular/http
.
Теперь мы также должны импортировать модуль Http
в наш файл модулей приложения. Итак, давайте делать это, прежде чем мы забудем. В наших родных модулях вверху я буду импортировать HttpModule
, а затем вниз в нашем импорте, давайте включим HttpModule
.
Теперь, когда мы импортировали это в оба необходимых места, мы можем использовать внедрение зависимостей, чтобы внедрить этот класс Http
в наш ProjectsService
. Таким образом, вместо того, чтобы делать что-то вроде new Http()
здесь, мы будем создавать функцию конструктора. И этот конструктор получит свойство типа Http
.
Angular увидит этот параметр при создании нашего экземпляра ProjectsService
и сопоставит этот класс Http
с HttpModule
который мы импортировали в наш модуль приложения, и HttpModule
экземпляр этого в конструктор.
Теперь мы могли бы написать this.http = http;
назначить этот параметр свойству нашего класса. Но на самом деле TypeScript имеет некоторый сокращенный синтаксис для этого, поэтому мы можем просто применить ключевое слово private
непосредственно внутри конструктора, и TypeScript автоматически сделает его свойством класса. И теперь из других методов класса мы можем использовать this.http
.
Итак, давайте создадим функцию с именем getProjects()
. Это будет метод, который мы вызываем, чтобы получить наш список проектов.
Теперь с функциями в TypeScript мы все еще можем использовать синтаксис : Type
чтобы указать тип возвращаемого значения функции. А для getProjects()
мы собираемся вернуть Observable
который оборачивает Project
.
Поэтому, прежде чем говорить о том, что это такое, давайте импортируем эти два класса. Итак, я собираюсь импортировать Observable
из rxjs
, а также импортировать нашу модель Project
.
Работа с наблюдаемыми
Так что же такое наблюдаемое? К сожалению, я никак не мог бы дать вам полное представление о наблюдаемых здесь, но Angular 2 действительно сильно зависит от наблюдаемых, и я постараюсь сделать их настолько простыми, насколько это возможно, по мере того, как мы будем проходить через это.
По сути, наблюдаемая — это оболочка, похожая на обещание или массив. У обоих обещаний, массивов и наблюдаемых есть и другие элементы. В случае массива у нас есть несколько элементов. В случае с обещанием у нас в основном есть какое-то единственное значение, которое мы получим в будущем.
Для наблюдаемых это может быть одно значение или много значений. Одно определение, которое иногда используется, — это асинхронный массив. По сути, наблюдаемый — это поток данных, который мы можем получить больше в любое время. И я думаю, что в ходе некоторых уроков вы увидите, как мы можем использовать наблюдаемые, чтобы немного упростить получение и настройку некоторых наших данных. На данный момент, если вы раньше не видели наблюдаемых, вы можете просто думать о них как об обещании.
Так что мы вернемся из этой функции? Что ж, мы можем сделать this.http.get()
, поэтому давайте получим /api/projects
который вернет наш список проектов. И затем мы можем сопоставить ответ с функцией, которую мы собираемся написать, с именем this.extractData
.
Вы можете представить здесь функцию map()
как метод then()
для обещания. Это работает так же, как и для массива, где map()
выполнит некоторую операцию с каждым из значений внутри этого массива, а затем вернет новый массив с этими новыми значениями.
В общем, map()
позволяет вам выполнять какие-то действия со значениями внутри контейнера. То же самое верно и для метода then()
в обещании. Вы можете вызвать then()
для обещания, чтобы вызвать некоторую функцию для значения внутри обещания. И тогда это возвращает новое обещание с любым новым значением, которое вы создали ..
То же самое и с map()
здесь. Мы собираемся вызвать extractData()
для ответа, который находится внутри этой наблюдаемой, и что мы вернем из этого, это наблюдаемая, которая оборачивает проект.
Итак, давайте создадим функцию extractData()
, и для этого потребуется класс Response
библиотеки Angular HTTP.
Поэтому мы вернем res.json()
, и это преобразует HTTP-ответ в фактическое тело JSON. Теперь значение из extractData()
будет возвращено внутри нашего getProjects()
, и Angular увидит, что это соответствует нашему типу возврата здесь, потому что это будет наблюдаемый массив проектов.
Импортируйте функцию в компонент Projects
Теперь, когда у нас есть эта getProjects()
, давайте перейдем к компоненту наших проектов и импортируем его. Прежде всего, давайте импортируем ProjectsService
.
Теперь, поскольку мы хотим внедрить экземпляр ProjectsService
в этот компонент, нам нужно сообщить Angular, что он должен предоставить экземпляр для этого компонента. Итак, давайте добавим свойство providers
в наш декоратор компонента, и мы скажем ему, что внутри этого компонента потребуется ProjectsService
. Итак, давайте добавим конструктор, и мы можем использовать внедрение зависимостей так же, как в нашем сервисе.
Мы создадим параметр с именем service
, и это будет объект ProjectsService
, и поэтому Angular будет знать, как вставить один из наших экземпляров ProjectsService
в этот класс. Мы дадим этот параметр здесь как ключевое слово private
чтобы он сразу устанавливал его как свойство.
Имея это в ngOnInit
, мы можем пойти дальше и использовать его внутри ngOnInit
. Таким образом, здесь мы можем вызвать this.service.getProjects()
помните, что это возвращает наблюдаемую — и метод, который мы хотим вызвать здесь subscribe()
.
Вы можете думать о методе subscribe()
как если бы мы вызывали then()
для обещания, которое было возвращено, или, если вы думаете об этом как о массиве, subscribe()
похож на метод forEach()
в массиве. Это похоже на map()
в том смысле, что оно получает все, что находится внутри массива, или в этом случае наблюдаемое.
Однако forEach()
не возвращает новый массив, а subscribe()
не возвращает новый наблюдаемый. Так что вроде как конец строки. Так что subscribe()
получит список наших проектов в качестве своего параметра, и мы можем просто сказать, что this.projects
, который ссылается на наш массив проектов, будет соответствовать projects
. Таким образом, мы можем развернуть его значение из наблюдаемого, и теперь это значение будет доступно из класса.
И если мы вернемся в браузер, чтобы увидеть наш список проектов, мы увидим три проекта, которые я поместил на сервер.
Смотреть полный курс
В полном курсе « Современные веб-приложения с Angular 2» я покажу вам, как кодировать законченное веб-приложение с Angular 2, используя самые современные функции и архитектурные шаблоны.
Вы можете присоединиться ко мне и создать полнофункциональное приложение для управления проектами, с входом и проверкой пользователя, а также с чатом в реальном времени. Вы получите уроки по языку шаблонов Angular 2, структурированию своего приложения, маршрутизации, валидации форм, службам, наблюдаемым и многому другому.
Если вы никогда не использовали Angular 2, изучите все, что вам нужно знать, в нашем курсе Начало работы с Angular 2 . Если вы хотите использовать свой опыт Angular 2, почему бы не проверить: