NullInjectorError: нет поставщика для компонента, но используются поставщики

Я создал приложение Angular (состоящее из службы и компонента списка) для вызова API и отправки действий, но ошибка возникает, когда я использую функции из компонента списка. Я помещаю компонент в конструктор, чтобы использовать его, также устанавливаю сервис как провайдера в app.module, а также в listcomponent как провайдер.

Обслуживание:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { posts, users } from '../api.actions';
import { ListComponent } from '../list/list.component';

@Injectable({
  providedIn: 'root',

})

export class ApiCallService {
  // constructor(public getId: ListComponent)

  public getUsers() {
    return this.http.get<users[]>('https://jsonplaceholder.typicode.com/users');
  }
  public getPosts()
  {
    return this.http.get<posts[]>('https://jsonplaceholder.typicode.com/posts');

  }

  public test()
  {
    let id = 0;
    this.getId.SendID(id);
    this.getId.SendID(id)
    console.info(id);

  }
  constructor(private http: HttpClient, private getId: ListComponent ) {

  }

}

Приложение.Модуль:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { StoreModule } from '@ngrx/store';
import { HttpClientModule } from '@angular/common/http';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';

import { StoreDevtoolsModule } from '@ngrx/store-devtools';
import { environment } from '../environments/environment';
import { ListComponent } from './list/list.component';
import { userReducer } from './api.reducer';
import { EffectsModule } from '@ngrx/effects';
import { ApiEffects } from './api.effect';
import { ApiCallService } from './ApiCall/api-call.service';


@NgModule({
  declarations: [
    AppComponent,
    ListComponent,


  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    FormsModule,
    StoreModule.forRoot({rootValue: userReducer}),
    StoreDevtoolsModule.instrument({maxAge: 25, logOnly: environment.production, autoPause: true}),
    EffectsModule.forRoot([ApiEffects])
  ],
  providers: [ApiCallService],
  bootstrap: [AppComponent]
})
export class AppModule { };

Компонент списка:

import { Component, Input, OnInit } from '@angular/core';
import { ApiCallService } from '../ApiCall/api-call.service';
import { Observable, map, BehaviorSubject, Subject } from 'rxjs';
import { Store } from '@ngrx/store'
import { RootState } from '../api.reducer';


@Component({
  selector: 'app-list',
  templateUrl: './list.component.html',
  styleUrls: ['./list.component.css'],
  providers: [ApiCallService]
})
export class ListComponent implements OnInit {


  constructor(private api: ApiCallService, private store: Store<{rootValue: RootState}>) { }

  users = [];
  Uid:number = 0;
  UId$ = new Subject<number>();

  //Used To display the users and posts in HTML file
  users$ = this.store.select('rootValue').pipe(map(data => data.users));
  posts$ = this.store.select('rootValue').pipe(map(data => data.posts));

  //gets triggered when SingleUser is clicked
  UserClicked(userId:number)
  {
    this.Uid = userId;
    this.SendID(this.Uid);

  }

  //Sends data to Service 
  SendID(userId:number)
  {
    this.UId$.next(userId);
  }

  //Function from Service
  Test()
  {
    this.api.test();
  }

  ngOnInit(): void {
  }

}

Там много кода, поэтому вам нужно будет искать только провайдеров.

Я ожидал, что это сработает, так как я установил его как провайдера в обоих случаях, а также даже не поместил туда никакого кода в сервисной функции.

Зачем вам нужно вводить компонент внутри службы? В Angular могут быть предоставлены и внедрены только сервисы.

Cheikh HAIBALA 10.01.2023 16:10

Я хотел получить данные в сервис от компонента

addy 10.01.2023 16:16

Вы можете определить субъект внутри сервиса, подписаться на него внутри сервиса и выдавать данные из компонента каждый раз, когда он вам нужен в сервисе. Обычно так мы общаемся между компонентами и сервисами. вы можете увидеть здесь: stackoverflow.com/questions/44066905/…

Cheikh HAIBALA 10.01.2023 16:18

Не могли бы вы поделиться кодом вместо картинок. Также поделитесь файлом app.module.

Bozhinovski 10.01.2023 16:28

Совместное использование кода внутри блоков кода вместо изображений сделало бы этот вопрос более доступным.

Scollier 10.01.2023 17:28

@CheikhHAIBALA, поэтому я добавил наблюдаемую в компонент списка и передал значение с помощью .next()

addy 11.01.2023 09:47

@addy, ты должен переосмыслить свое приложение. Вы не можете внедрить компонент в свой сервис. Как правило, службы предоставляются «в корневом каталоге» (или в модуле), поэтому они существуют на протяжении всего жизненного цикла приложения. Компонент существует, только если он виден. Сервис обычно вызывает API и возвращает Observables. Это компонент, в котором вы подписываетесь на эти наблюдаемые. Если вы хотите «связать» компонент со службой, вы можете использовать другую службу и использовать более близкий вариант, когда мы связываем два компонента с помощью службы - на самом деле я не могу представить ситуацию, в которой это необходимо -

Eliseo 11.01.2023 10:11

@Элизео, спасибо за помощь. Дело в том, что я хотел получить значение от компонента для службы, чтобы изменить URL-адрес API-вызова, потому что вы также можете получить из API только конкретные данные, в этом примере отображать все сообщения пользователя с одним и тем же идентификатором . Думал, что это сработает, если я просто добавлю его в конструктор для вызова функции.

addy 11.01.2023 10:17

Затем передайте от компонента службе идентификатор или URL-адрес. Если вы определяете в своем сервисе две переменные «url» и «id», вы можете из компонента написать:this.api.url = "..." или this.api.callAnApi(this.id), даже вы можете иметь функцию в сервисе setConfig и снова использовать из компонента, например this.api.setConfig({url:...,id:...}

Eliseo 11.01.2023 10:41

Спасибо! Это сработало для меня. Иногда решение этой проблемы так просто, просто оно стало намного сложнее, чем должно было быть.

addy 11.01.2023 10:57
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему &apos;[] instanceof Object&apos; возвращает &quot;true&quot;?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
0
10
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Удалите компонент из конструктора службы следующим образом:

export class ApiCallService {
...
   constructor(private http:HttpClient) {}
...
}

Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.

Ronald Haan 11.01.2023 08:39

Другие вопросы по теме