【问题标题】:angular - changing data in assets folder of the build角度 - 在构建的资产文件夹中更改数据
【发布时间】:2019-03-22 09:40:13
【问题描述】:

我希望我的 Angular 应用程序在没有服务器的情况下作为独立应用程序工作。

assets 文件夹中有图像、声音文件等,还有一个 game.json 文件,其中包含应用程序的业务数据(在服务器上,这些数据将存储在数据库中或将通过 Rest 调用)。

一切运作良好。使用“ng build”,我可以通过在我的操作系统中打开 index.html 来创建完整的构建 - 没有 http-Server 的文件管理器。

问题是我无法在构建之后更改 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 中的更改被完全忽略。

有没有办法让这个文件“可修改”,以便我可以在构建的资产文件夹中更改它?

【问题讨论】:

  • 为什么你不想使用 HTTPClient 从 assets 文件夹中获取数据?如果你这样做,我认为你不会有任何与 CORS 相关的问题。
  • 我尝试过,但遇到了 CORS 问题。
  • 你可以试试我下面提到的解决方案。

标签: angular assets


【解决方案1】:

您可以从 assets 文件夹中获取数据,如下所示,您还可以更改它的运行时间。

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]
})

【讨论】:

  • 我使用 angular 5. 所以注释中没有 'providedIn' 属性。我用 Injectable 标记了该服务,并在 game.module.ts 中添加了提供程序部分。我删除了 comp 中的提供程序。 -> 异常:StaticInjectorError()[InjectionToken Application Initializer -> GameService]: NullInjectorError: No provider for GameService!如果我将服务添加到组件中的提供程序部分,它也不起作用
  • 在APP_INITIALIZER代码上方的app module providers中提供GameService,就可以了。
  • 我做到了。 GameService 正如你所建议的那样。 app.module.ts 现在包含 APP_INITIALIZER - 提供程序和工厂等。使用该服务的子模块在 game.module.ts 中。我是否必须在 comp. 中注册服务?还是模块?或者该服务是否可以“从根”访问。即通常来自任何地方?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2020-01-04
  • 1970-01-01
相关资源
最近更新 更多