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, почему бы не проверить:
