如何从常规打字稿类(非组件)中调用angular 2+服务

时间:2019-03-19 18:39:54

标签: angular typescript phaser-framework

我正在构建一个角度为6的Phaser 3应用程序。我想在一个打字稿类(这是Phaser场景)中调用服务(GameService)。如何使类使用依赖注入?

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 :(得分:0)

您可以将@Injectable批注添加到非角度类,并将其添加到ngmodule使其可注入。但这似乎不是“正确的”。

我认为您在这里混淆了一些概念。游戏开发(Phaser)使用的概念与角度游戏不同。

您要在哪里调用/创建PlayerConfigScene-Object?这不是在角组件内还是可注射的?您难道不只是将所需的服务注入到您的组件,然后用您的服务构造您的配置对象吗?

如果要将游戏嵌入到有角项目中,则应将游戏封装在web component或至少在组件中:

@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);
  }
}