私は角度2アプリをロードする前にデータベースからいくつかの設定オプションを取得しようとしています。これらの設定オプションに基づいて特定のコンポーネントへのアクセスを制限する必要があるため、角度アプリは起動前にデータが読み込まれるまで待つ必要があります。角度2アプリがAoTを使用して開始する前にデータベースから設定をロード
バックエンドからデータを取得するためにConfigurationServiceを作成しました。ルートモジュールでapp_initializerを使用して、アプリケーションを起動する前にコンフィギュレーションサービスを呼び出しようとしています。私は数ヶ月前に作成した角型アプリ(角型RC4)でこれを行うことができ、今回は同じようにこれをやり遂げようとしました。
app.module.ts - まずこれは、次のエラーが生じた
import { NgModule, APP_INITIALIZER } from '@angular/core';
import { AppComponent } from './app.component';
import { RouterModule } from '@angular/router';
import { HttpModule } from '@angular/http';
import { ConfigurationService } from "./shared/services/configuration.service";
@NgModule({
imports: [
...
],
declarations: [
...
],
providers: [
{
provide: APP_INITIALIZER,
useFactory: (config: ConfigurationService) =>() => config.loadConfiguration(),
deps: [ConfigurationService]
},
ConfigurationService
],
bootstrap: [AppComponent]
})
export class AppModule { }
を試してみてください。
Error encountered resolving symbol values statically. Function calls are not supported. Consider replacing the function or lambda with a reference to an exported function
私は「は、これはIBMアカデミーコンパイラとは何かを持っていると思いますを使用しています。ラムダ式を工場で置き換えました。
app.module.ts - 第二には、これは実際にconfigurationserviceを使用してバックエンドからデータを取得
import { NgModule, APP_INITIALIZER } from '@angular/core';
import { AppComponent } from './app.component';
import { RouterModule } from '@angular/router';
import { HttpModule } from '@angular/http';
import { ConfigurationService } from "./shared/services/configuration.service";
import { ConfigurationServiceFactory } from "./shared/services/configuration.service.factory";
@NgModule({
imports: [
...
],
declarations: [
...
],
providers: [
{
provide: APP_INITIALIZER,
useFactory: ConfigurationServiceFactory,
deps: [ConfigurationService]
},
ConfigurationService
],
bootstrap: [AppComponent]
})
export class AppModule { }
configuration.service.factory.ts
import { ConfigurationService } from "./configuration.service";
export function ConfigurationServiceFactory(configurationService: ConfigurationService) {
return configurationService.loadConfiguration()
.then(currentUser => {
configurationService.currentUser = currentUser;
}
);
}
を試してみたが、アプリを起動する前に解決するという約束を待つことはありません。これは、ユーザーがホームページ(誰でもアクセスできる)から起動し、管理者以外のユーザーに制限されているコンポーネントに移動するときに機能します。しかし、ユーザーが制限されているページをリフレッシュすると、設定がロードされる前にOnInit(ユーザーがアクセスできるかどうかを判断する場所)が起動します。私の場合、ユーザーはアクセスする必要があるページへのアクセスが拒否されます。
configuration.service.ts
import { Injectable } from "@angular/core";
import { Http, Response } from '@angular/http';
import { CurrentUser } from "../models/currentuser.model";
@Injectable()
export class ConfigurationService {
public apiUrl: string = "api/";
public currentUser: CurrentUser;
constructor(private http:Http) {}
/**
* Get configuration from database
*/
public loadConfiguration(): Promise<CurrentUser> {
return this.http.get(this.apiUrl + "application/GetDataForCurrentUser")
.toPromise()
.then(this.extractData)
.catch(this.handleError);
}
}
コンポーネントの実装は
import { Component, OnInit } from '@angular/core';
import { MessageService } from '../shared/message/message.service'
import { ConfigurationService } from "../shared/services/configuration.service";
@Component({
selector: 'simple',
templateUrl: 'simple.component.html'
})
export class SimpleComponent implements OnInit{
constructor(private messageService: MessageService, private configurationService: ConfigurationService) {
}
ngOnInit() {
if (!this.configurationService.isAdmin()) {
this.messageService.addMessage("Access denied", "danger");
}
}
}
私はすべてのこの時間でアイデアを、私は解決策を探しただけで管理しています私のために働いていないラムダオプションを推薦する人々を見つけるために。 app.module.ts内部からサービスを呼び出すことに遅れていたと私は代わりにmain.tsファイル内からサービスを呼び出す必要があることを指摘しangular gitter channel、上@DzmitryShylovichの助けを借りて
@ types/whatwg-fetchを取り込む際に、重複した識別子エラーを回避するにはどうすればよいですか? lib.d.tsには入力のフェッチが含まれているようですので、手動で入力すると衝突が発生します。 –