Я создал приложение 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 {
}
}
Там много кода, поэтому вам нужно будет искать только провайдеров.
Я ожидал, что это сработает, так как я установил его как провайдера в обоих случаях, а также даже не поместил туда никакого кода в сервисной функции.
Я хотел получить данные в сервис от компонента
Вы можете определить субъект внутри сервиса, подписаться на него внутри сервиса и выдавать данные из компонента каждый раз, когда он вам нужен в сервисе. Обычно так мы общаемся между компонентами и сервисами. вы можете увидеть здесь: stackoverflow.com/questions/44066905/…
Не могли бы вы поделиться кодом вместо картинок. Также поделитесь файлом app.module.
Совместное использование кода внутри блоков кода вместо изображений сделало бы этот вопрос более доступным.
@CheikhHAIBALA, поэтому я добавил наблюдаемую в компонент списка и передал значение с помощью .next()
@addy, ты должен переосмыслить свое приложение. Вы не можете внедрить компонент в свой сервис. Как правило, службы предоставляются «в корневом каталоге» (или в модуле), поэтому они существуют на протяжении всего жизненного цикла приложения. Компонент существует, только если он виден. Сервис обычно вызывает API и возвращает Observables. Это компонент, в котором вы подписываетесь на эти наблюдаемые. Если вы хотите «связать» компонент со службой, вы можете использовать другую службу и использовать более близкий вариант, когда мы связываем два компонента с помощью службы - на самом деле я не могу представить ситуацию, в которой это необходимо -
@Элизео, спасибо за помощь. Дело в том, что я хотел получить значение от компонента для службы, чтобы изменить URL-адрес API-вызова, потому что вы также можете получить из API только конкретные данные, в этом примере отображать все сообщения пользователя с одним и тем же идентификатором . Думал, что это сработает, если я просто добавлю его в конструктор для вызова функции.
Затем передайте от компонента службе идентификатор или URL-адрес. Если вы определяете в своем сервисе две переменные «url» и «id», вы можете из компонента написать:this.api.url = "..." или this.api.callAnApi(this.id), даже вы можете иметь функцию в сервисе setConfig и снова использовать из компонента, например this.api.setConfig({url:...,id:...}
Спасибо! Это сработало для меня. Иногда решение этой проблемы так просто, просто оно стало намного сложнее, чем должно было быть.
Удалите компонент из конструктора службы следующим образом:
export class ApiCallService {
...
constructor(private http:HttpClient) {}
...
}
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Зачем вам нужно вводить компонент внутри службы? В Angular могут быть предоставлены и внедрены только сервисы.