NoneNgrx / служба данных объекта данных
Попытка понять пример службы данных сущности ngrx/data здесь, где говорится "Создание служб данных сущности". После показа этой службы, документы продолжают показывать, как использовать ngrx/data в компонентах. Интересующая меня часть компонента такова:
getHeroes() {
this.heroService.getAll();
}
Документы утверждают, что getAll()
инициирует HTTP-запрос, но я не уверен, где и как этот запрос фактически сделан. В репозитории ngrx-data. В нем говорится о замене heroService следующим кодом:
import { Injectable } from '@angular/core';
import {
EntityCollectionServiceBase,
EntityCollectionServiceElementsFactory
} from 'ngrx-data';
import { Hero } from '../core';
@Injectable({ providedIn: 'root' })
export class HeroService extends EntityCollectionServiceBase<Hero> {
constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) {
super('Hero', serviceElementsFactory);
}
}
Документы государства ngrx-data handles getting and saving our data for us
, Это здорово, но я не знаю, где происходит сбор данных. Я клонировал репо, проверил finish
филиал и не смог найти то, что попадает в конечные точки.
Например, услуга, используемая для вызова http.get(${api}/heroes)
за getAll()
чтобы получить всех героев, но это заменено приведенным выше кодом, так где же происходят эти вызовы?
Я заметил, что EntityCollectionServiceBase
имеет getAll()
метод. Но где происходит конфигурация этого сервиса для регистрации соответствующих конечных точек? Я уверен, что мне здесь не хватает чего-то невероятно простого.
4 ответа
Вообще говоря EntityCollectionServiceBase
отправляет действия и с помощью эффекта сохранения вEntityEffects
в DefaultDataService
вызывается и отображает ответ на свои успешные / неудачные действия. См. Обзор архитектуры
Следовательно, если вы хотите получить доступ / преобразовать данные, возвращаемые из API, вы расширяете / заменяете DefaultDataService
. Вы можете зарегистрировать свою службу пользовательских данных, используяEntityDataService
который в основном представляет собой реестр служб данных, который получает или создает службу данных (используется по умолчанию, если таковой не существует).
Вы можете зарегистрировать провайдера для этого в app.module
providers: [
{ provide: DefaultDataServiceConfig, useValue: defaultDataServiceConfig } ]
export const defaultDataServiceConfig: DefaultDataServiceConfig = {
root: 'myapi/baseurl',
timeout: 1000 * 60, // request timeout }
Просто глядя на документы, может показаться, что DefaultDataService "Составляет URL-адреса HTTP из корневого пути и имени объекта"
Документы также рекомендуют проверить раздел " Конфигурация " ниже в документах, чтобы указать свои собственные URL-адреса для взаимодействия с Entity DataService.
Вероятно, вы можете увидеть созданные сгенерированные конечные точки на вкладке Сеть инструментов разработчика, играя с примером приложения.
Надеюсь, это поможет.
Запросы HttpClient выполняются вDefaultDataService.execute()
. Чтобы сделать эти запросы, экземпляр использует экземпляр, который был внедрен в экземпляр, используемый для его создания (для создания того, что есть).
Как предложили другие пользователи, вы можете предоставить альтернативуDefaultDataServiceConfig
к которому будет использоватьсяDefaultDataServiceFactory.create<T>()
создатьDefaultDataService
. Например, вы можете изменить корневой путь на полную конечную точку по вашему выбору, напримерhttps://my-endpoint/
. Обратите внимание, что поскольку путь конечной точки ngrx/data по умолчаниюapi
распознает это как относительный путь и будет использовать протокол по умолчанию + хост + порт, поэтому, если вы работаете в режиме angular dev, это будетlocalhost:4200
.
Если вы хотите больше контролировать http-запросы, вы также можете использовать пользовательскийDataServiceFactory
путем расширенияDefaultDataServiceFactory
и вводить свои собственныеHttpClient
экземпляр - таким образом вы также можете подключить перехватчики, если у вас есть более сложные потребности.