Как вызвать угловой сервис 2+ из обычного машинописного класса (не компонентного) - PullRequest
1 голос
/ 19 марта 2019

Я создаю приложение Phaser 3 с angular 6. Я хочу вызвать сервис (GameService) в классе машинописного текста (который является сценой Phaser). Как заставить класс использовать Dependency Injection?

export class PlayerConfigScene extends Phaser.Scene {

    constructor(private gameService: GameService) {
        super({
            key: "PlayerConfigScene"
        });
    }

    init() {
        this.gameService.setEnableForms(true);
    } 
}

Это услуга

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class GameService {

  private enableForms : BehaviorSubject<boolean> = new BehaviorSubject<boolean> (false);

  constructor() { }

  public setEnableForms(flag : boolean) {
    this.enableForms.next(flag);
  }

  public getEnableForms() : BehaviorSubject<boolean> {
    return this.enableForms;
  }


}

1 Ответ

0 голосов
/ 19 марта 2019

Вы можете добавить аннотацию @Injectable в свой неугловой класс и добавить его в модуль ngmodule, чтобы сделать его инъекционным. Но это не кажется «правильным».

Я думаю, что вы путаете понятия здесь. В разработке игр (Phaser) используются разные концепции, чем в angular.

Куда вы звоните / создаете свой PlayerConfigScene-Object? Разве это не угловой компонент или инъекционный? Не могли бы вы просто внедрить требуемый сервис в ваш компонент, а затем создать объект конфигурации с вашим сервисом?

Если вы встраиваете свою игру в угловой проект, вы должны поместить ее в веб-компонент или, по крайней мере, в компонент:

@Component({
  selector: "my-game-wrapper-component",
  template: "<div #myGameWrapper></div>"
})
export class MyGameWrapperComponent implements AfterViewInit {

  @ViewChild("myGameWrapper", { read: ElementRef }) myGameWrapperDiv: ElementRef;

  private game: MyAwesomeGame;

  constructor(private myAwesomeGameService: MyAwesomeGameService) {
    // MyAwesomeGameService has to be an injectable angular service
  }

  public ngAfterViewInit(): void {
    this.game = new MyAwesomeGame(this.myGameWrapperDiv.nativeElement, this.myAwesomeGameService);
  }
}
...