Angular: как отправить данные с кнопки в службу?

#angular

#angular

Вопрос:

У меня в заголовке есть кнопка, которая позволяет изменять язык моего приложения. Я хочу, чтобы выбранный язык был доступен для всех компонентов через службу. Я знаю, как отправлять данные из службы в компонент («использовать службу»), но я не могу понять, как отправить данные с кнопки в службу.

Вот кнопка:

   <mat-menu #menu="matMenu">
    <button (click)="change_L1_Language('en-US')">English<img width="50" alt="Flag of the United States" src="../assets/images/flags/us-flag.svg"></button>
    <button (click)="change_L1_Language('es')">Español<img width="50" alt="Flag of Spain" src="../assets/images/flags/es-flag.svg"></button>
    <button (click)="change_L1_Language('zh')">中文<img width="50" alt="Flag of China" src="../assets/images/flags/ch-flag.svg"></button>
    <button (click)="change_L1_Language('jp')">日本人<img width="50" alt="Flag of Japan" src="../assets/images/flags/jp-flag.svg" class="flag-border"></button>
  </mat-menu>
  

Контроллер обрабатывает щелчок:

 import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { LanguageService } from '../language.service';

export class HeaderComponent implements OnInit {
  language: string = 'en-US';
  newLanguage: string = 'en-US';
  @Output() changeLanguageData: EventEmitter<string> = new EventEmitter<string>();

changeLanguage(newLanguage) {
    console.log(this.language);
    switch (true) {
      case (newLanguage === 'en-US'):
      this.language = 'en-US';
      break;

      case (newLanguage === 'es'):
      this.language = 'es';
      break;

      case (newLanguage === 'zh'):
      this.language = 'zh';
      break;

      case (newLanguage === 'jp'):
      this.language = 'jp';
      break;

      default:
      console.log("Error in switch-case.");
    }
    console.log(this.language);
    this.changeLanguageData.emit(this.language); // send data to parent
    this.LanguageService.changeLanguage().subscribe(); // receives data from a service, doesn't send data
  }
  

Контроллер подключен к LanguageService (службе), но контроллер может использовать только данные из службы, он не может передавать данные в службу.

Контроллер также имеет Event Emitter возможность отправлять данные родительскому компоненту. Это не может отправить данные в службу, потому что у службы нет .html шаблона для связи между компонентами.

Глядя на документацию Angular, она показывает, как компоненты в семействе могут взаимодействовать через службу: родительский и дочерний элементы взаимодействуют через службу. Если я изменю это на

 @Injectable({
  providedIn: 'root'
})
  

будет ли эта служба предоставлять данные всем компонентам моего приложения?

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

В документации показаны три метода отправки данных от дочернего элемента к родительскому. Метод, с которым я знаком, Родительский прослушивает дочернее событие с помощью an EventEmitter , не будет работать, потому что у службы нет .html шаблона для связывания компонентов.

Ответ №1:

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

TS:

 constructor(private languageService: LanguageHandler) { }
  

Затем вы можете использовать его в своем компоненте, чтобы изменять данные по щелчку:

HTML:

 <button (click)="changeLanguage("en-US")>Change to English</button>
  

TS:

 changeLanguage(languageToChangeTo) {
  languageService.currentLanguage = languageToChangeTo;
}
  

Комментарии:

1. Это сработает, если я изменю последнюю строку на this.languageService.changeLanguage(language);

2. Это зависит от того, как написан ваш сервис. Если это записано в стиле изменения метода, ваша строка верна, но если вы используете getter и setter, моя строка будет правильной, я думаю, это довольно личные предпочтения в отношении того, что вы используете.