ANGULAR — передать переменную из компонента в сервис

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

Предпосылка проста: у меня есть переменная/значение, которое поступает из API, и мне нужно, чтобы эта переменная была передана компоненту службы (который содержит запрос GET и URL-адрес, где мне нужно значение).

Я думал об использовании EventEmitter для создания моей переменной, но тогда у службы нет HTML для подписки на нее.

Вот несколько фрагментов кода:

app.component.ts

private data: any[] = [];

ngOnInit(): void {
    this.apiService.getData().subscribe(response => {
      this.data = response.data;
      
      console.info(this.data.id);
    });
  }

API.service.ts

@Injectable({
  providedIn: 'root',
})
export class PromptApiService {
  private readonly apiUrl = 'MY_API_URL;

/*I need the id variable from component to access here*/

  constructor(
    private http: HttpClient,
  ) {}

  getData(): Observable<> {
    return this.http.get<>(
      `${this.apiUrl}/mydata`,
    );
  }
}

Мне пришлось удалить часть кода из соображений конфиденциальности, так как это рабочий проект, поэтому прошу прощения, если кода мало.

Как лучше всего передать переменную от компонента к сервису? Любые предложения будут ценны.

Отвечает ли это на ваш вопрос? Угловая передача переменной из компонента в сервис

Bozhinovski 01.02.2023 13:01

Я думаю, что это как бы отвечает на мой вопрос, но, как и в предыдущем решении, переменная, которую я установил в файле service.ts, получает ошибку IDE, которую она объявила, но никогда не читала.

Traznix 01.02.2023 13:28

Это не ошибка, это предупреждающее сообщение, также вам нужно присвоить переменную самому методу.

Bozhinovski 01.02.2023 13:34
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
3
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Такие вещи могут быть немного сложными, когда вы начинаете.

Чтобы передать переменную из компонента в службу, у вас есть простое решение:

  1. Внутри сервиса api.service.ts вы можете создать переменную вверху и сеттер:
@Injectable({
  providedIn: 'root',
})
export class PromptApiService {
  private myVariable:string;  // THIS LINE

  private readonly apiUrl = 'MY_API_URL';

  constructor(
    private http: HttpClient,
  ) {}

  setMyVariable(myVariable:string):void {  // THIS FUNCTION
    this.myVariable=myVariable;
  }

  getData(): Observable<> {
    ...
  }
}
  1. Внутри app.component.ts вы создаете экземпляр сервиса в конструкторе и используете сеттер:
constructor( private apiSvc: PromptApiService ) {}   // THIS LINE

ngOnInit(): void {
   this.apiSvc.setMyVariable("HELLO");   // THIS LINE
}

Это выглядит довольно прямолинейно, однако я получаю сообщение об ошибке в IDE, что переменная объявлена, но никогда не читается - в файле service.ts

Traznix 01.02.2023 13:26
Ответ принят как подходящий

Вы можете просто переместить свою переменную data в свой сервис, а затем использовать ее в своих компонентах, сделав свой сервис public

api.service.ts

@Injectable({
  providedIn: 'root',
})
export class PromptApiService {
  private readonly apiUrl = 'MY_API_URL';
  public data: any[] = [];

  constructor(private http: HttpClient) {}

  getData(): Observable<> {
    return this.http.get<>(`${this.apiUrl}/mydata`);
  }
}

app.component.ts

export class AppComponent {
  constructor(public promptApiService: PromptApiService)

  ngOnInit(): void {
    this.promptApiService.getData().subscribe(response => {
      this.promptApiService.data = response.data;
    });
  }
}

app.component.html

<div *ngIf = "promptApiService.data">
  <p>{{ promptApiService.data.id }}</p>
</div>

Примечание. Это предполагает, что вы используете метод обнаружения изменений по умолчанию, а не OnPush

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