角度-更改构建资源文件夹中的数据

时间:2019-03-22 09:40:13

标签: angular assets

我希望我的有角度的应用程序可以在没有服务器的情况下独立运行。

在资产文件夹中是图像,声音文件等,以及一个包含游戏应用程序业务数据的 game.json 文件(在服务器上,该数据将存储在数据库中,通过Rest调用。

一切正常。使用“ ng build”,可以通过在我的OS-文件管理器中打开没有http服务器的index.html来创建一个完整的构建。

问题是在构建后,我无法更改 game.json 的内容,因为它似乎以某种方式包含在构建中。更改将被忽略,它会将内容冻结为已编译状态。

由于我将仅在本地运行该应用程序,因此我以这种方式读取数据:

typings.d.ts:

declare module "*.json" {
   const value: any;
   export default value;
 }

game.service.ts:

import * as data_json from 'assets/data/game.json';

@Injectable()
export class GameService {

  constructor() { }
      loadGames(): Observable<Game> {
        return Observable.of(JSON.parse(JSON.stringify(data_json)));
      }
}

我不使用HTTPClient,因为会遇到CORS问题。 读取数据可以正常工作,但是文件game.json中的更改将被完全忽略。

是否有一种方法可以使该文件“可修改”,以便可以在构建的assets文件夹中对其进行更改?

1 个答案:

答案 0 :(得分:1)

您可以从资产文件夹中获取数据,如下所示,并且还可以更改其运行时间。

import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";

@Injectable({
  providedIn: "root"
})
export class GameService {
  private gameData: any;

  constructor(private http: HttpClient) {}

  loadGameData() {
    return this.http
      .get("/assets/data/game.json")
      .toPromise()
      .then(data => {
        this.gameData= data;
      });
  }

  get gameData() {
    if (!this.gameData) {
      throw Error("Game file not loaded!");
    }
    return this.gameData;
  }
}

app.module.ts更改:

import { NgModule, APP_INITIALIZER } from "@angular/core";
import { GameService } from "./services/GameService.service";

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule
  ],
  providers: [
    [
      {
        provide: APP_INITIALIZER,
        multi: true,
        deps: [GameService],
        useFactory: (gameService: GameService) => {
          return () => {
            return gameService.loadGameData();
          };
        }
      }
    ]
  ],
  bootstrap: [AppComponent]
})