Статьи

Руководство для начинающих по Angular 4: Услуги

В первой части руководства для начинающих по учебному пособию по Angular вы узнали, какие компоненты есть в Angular 4 и как писать компоненты Angular.

В этой части серии руководств вы узнаете, какие сервисы есть в Angular и как их использовать.

Вы начнете с клонирования исходного кода из первой части серии уроков.

1
git clone https://github.com/royagasthyan/AngularComponent.git

Получив исходный код, перейдите в каталог проекта и установите необходимые зависимости.

1
2
cd AngularComponent
npm install

После установки зависимостей запустите приложение, введя следующую команду:

1
ng serve

Приложение должно быть запущено по адресу http: // localhost: 4200 / .

В приложении Angular компоненты имеют дело с представлением данных представлению. Выборка данных для отображаемых компонентов обрабатывается сервисами Angular.

Поскольку часть выборки данных обрабатывается отдельно в сервисах Angular, это облегчает имитацию сервисов тестирования.

Из официальной документации:

Компоненты не должны извлекать или сохранять данные напрямую, и они, конечно, не должны сознательно представлять поддельные данные. Они должны сосредоточиться на представлении данных и делегировать доступ к данным службе.

В этом руководстве вы узнаете, как создать службу Angular для извлечения данных для компонента Angular.

Другое преимущество использования сервисов Angular заключается в том, что он облегчает обмен данными между двумя отдельными компонентами.

В этом руководстве вы создадите компонент word, который будет искать слово запроса, введенное конечным пользователем, по API и возвращать результат поиска.

Вы будете выполнять вызов API с помощью службы Angular. Итак, начнем с создания углового компонента.

Перейдите в каталог проекта и создайте папку с именем word .

В каталоге проекта word создайте файл с именем word.component.html . Добавьте следующий HTML-код:

1
2
3
4
5
6
<h2>
    Word Component
</h2>
<div>
    <input type=»text»>
</div>

Создайте файл с именем word.component.ts который будет управлять шаблоном word.component.html . Вот как это выглядит:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
import { Component } from ‘@angular/core’;
 
@Component({
  selector: ‘word’,
  templateUrl: ‘word.component.html’,
  styleUrls: [‘word.component.css’]
})
export class WordComponent {
   
    constructor(){
         
    }
 
}

Как видно из приведенного выше кода, вы только что создали класс WordComponent который будет управлять word.component.html шаблона word.component.html .

Он имеет декоратор @component котором вы определили selector с помощью которого он будет доступен, templateUrl и компонент styleUrls .

После того, как вы создали компонент, вам нужно добавить класс компонента в NgModule .

Откройте файл app.module.ts каталоге src/app и импортируйте новый WordComponent .

1
import { WordComponent } from ‘./word/word.component’

Включите WordComponent в объявлениях NgModule . Вот как app.module.ts файл app.module.ts :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
import { BrowserModule } from ‘@angular/platform-browser’;
import { NgModule } from ‘@angular/core’;
 
import { AppComponent } from ‘./app.component’;
import { CalcComponent } from ‘./calc/calc.component’
import { WordComponent } from ‘./word/word.component’
import { FormsModule } from ‘@angular/forms’;
 
@NgModule({
  declarations: [
    AppComponent,
    CalcComponent,
    WordComponent
  ],
  imports: [
    BrowserModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Откройте файл app.component.html папке src/app и добавьте новый WordComponent используя определенный селектор. Вот как это выглядит:

1
2
3
<div style=»text-align:center»>
  <word></word>
</div>

Сохраните вышеуказанные изменения и перезагрузите сервер. Вы должны иметь слово компонент отображается при загрузке приложения.

Компонент слова

Давайте создадим службу Angular для запроса слова по URL службы, который будет возвращать синонимы слова.

Вы будете использовать API Datamuse для запроса ключевого слова.

Создайте файл с именем word.service.ts в word.service.ts src/app/word . Вы будете использовать декоратор @Injectable() чтобы сделать класс обслуживания доступным для внедрения.

Вот как будет выглядеть файл word.service.ts :

01
02
03
04
05
06
07
08
09
10
import { Injectable } from ‘@angular/core’;
 
@Injectable()
export class WordService {
 
    constructor(){
         
    }
 
}

Чтобы сделать вызов API, вы будете использовать модуль HTTP . Импортируйте HttpModule в HttpModule src/app/app.module.ts . Вот как выглядит файл:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import { BrowserModule } from ‘@angular/platform-browser’;
import { NgModule } from ‘@angular/core’;
 
import { AppComponent } from ‘./app.component’;
import { CalcComponent } from ‘./calc/calc.component’
import { WordComponent } from ‘./word/word.component’
import { FormsModule } from ‘@angular/forms’;
import { HttpModule } from ‘@angular/http’;
 
@NgModule({
  declarations: [
    AppComponent,
    CalcComponent,
    WordComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Импортируйте модуль Http в файл word.service.ts для выполнения вызовов API.

1
import { Http } from ‘@angular/http’;

Вы будете делать вызовы API по следующему URL.

1
https://api.datamuse.com/words?max=10&ml=

Вам нужно добавить ключевое слово запроса вместе с указанным выше URL, чтобы получить максимум 10 синонимов термина запроса.

Определите переменную url внутри класса WordService и инициализируйте ее внутри метода конструктора.

1
2
3
4
5
6
7
8
export class WordService {
      
    url: string
 
    constructor(private http : Http){
        this.url = ‘https://api.datamuse.com/words?max=10&ml=’
    }
}

Вы объявили и инициализировали переменную http , которую будете использовать при выполнении вызовов API.

Определите метод с именем search_word который будет возвращать результат вызова API как JSON . Вот как это выглядит:

1
2
3
4
5
search_word(term){
    return this.http.get(this.url + term).map(res => {
        return res.json()
    })
}

Как видно из приведенного выше кода, вы сделали запрос GET к URL-адресу API с помощью модуля Angular Http и вернули ответ в виде JSON . Вот как word.service.ts файл word.service.ts :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
import { Injectable } from ‘@angular/core’;
import { Http } from ‘@angular/http’;
import ‘rxjs/add/operator/map’
 
@Injectable()
export class WordService {
      
    url: string
 
    constructor(private http : Http){
        this.url = ‘https://api.datamuse.com/words?max=10&ml=’
    }
 
    search_word(term){
        return this.http.get(this.url + term).map(res => {
            return res.json()
        })
    }
}

Теперь, когда у вас есть служба Word, готовая выполнять вызовы API, вам нужно определить WordService в качестве поставщика в WordComponent .

Импортируйте WordService в файл word.component.ts .

1
import { WordService } from ‘./word.service’;

Определите providers в угловом WordComponent .

1
2
3
4
5
6
@Component({
  selector: ‘word’,
  templateUrl: ‘word.component.html’,
  styleUrls: [‘word.component.css’],
  providers : [WordService]
})

Инициализируйте WordService внутри метода constructor .

1
2
3
constructor(private service: WordService){
     
}

Определите метод с именем search внутри файла word.component.ts который будет вызывать метод службы. Внутри метода search подпишитесь на метод search_word из WordService .

1
2
3
4
5
search(term){
    this.service.search_word(term).subscribe(res => {
        this.words = res;
    })
}

Вот как выглядит измененный файл word.component.ts :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import { Component } from ‘@angular/core’;
import { WordService } from ‘./word.service’;
 
@Component({
  selector: ‘word’,
  templateUrl: ‘word.component.html’,
  styleUrls: [‘word.component.css’],
  providers : [WordService]
})
export class WordComponent {
   
    words : any;
    constructor(private service: WordService){
         
    }
 
    search(term){
        this.service.search_word(term).subscribe(res => {
            this.words = res;
        })
    }
 
}

Добавьте событие нажатия клавиши ввода в элемент ввода в файле word.component.html .

1
<input #query (keyup.enter)=»search(query.value)» type=»text»>

После ввода word.component.ts запроса, когда пользователь нажимает клавишу ввода, он вызывает метод поиска в файле word.component.ts .

Как видно из метода search внутри файла word.component.ts , вы собираете ответ внутри переменной words в виде списка. Итак, давайте word.component.html список words и отобразим их в файле word.component.html .

Измените файл word.component.html как показано ниже:

1
2
3
4
5
6
7
<div>
    <ul>
        <li *ngFor=»let item of words»>
            {{item.word}}
        </li>
    </ul>
</div>

Сохраните вышеуказанные изменения и перезагрузите сервер. Введите ключевое слово и нажмите клавишу ввода, и вы должны получить результат в виде списка.

Компонент Word с обслуживанием

В этом уроке вы узнали, что такое сервисы Angular. Вы узнали, как создавать сервисы Angular и использовать их из компонента Angular. Вы создали компонент Word, который запрашивает введенное ключевое слово в службе Angular и отображает возвращенные данные в файле шаблона компонента.

Каким был ваш опыт изучения услуг Angular? Дайте нам знать ваши мысли и предложения в разделе комментариев ниже.

Исходный код из этого урока доступен на GitHub .