大佬教程收集整理的这篇文章主要介绍了在Angular 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
我认为这与我正在使用的AoT编译器有关.我用工厂替换了lambda表达式.
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"; import { ConfigurationServiceFactory } from "./shared/services/configuration.service.factory"; @NgModule({ imports: [ ... ],useFactory: ConfigurationServiceFactory,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"); } } }
这就是我在自己的解决方案中所做的工作.
constants.ts
import { OpaqueToken } from '@angular/core' export const CONfig_TOKEN = new OpaqueToken('config');
我创建了一个OpaqueToken to avoid naming collisions
main.ts
import { platformBrowser } from '@angular/platform-browser'; import { AppModuleNgFactory } from '../aot/app/app.module.ngfactory'; import { CONfig_TOKEN } from './shared/constants/constants' const configApi = "yoururlhere"; fetch(configApi,{ credentials: 'include' }).then(parseResponse); function parseResponse(res: any) { return res.json().then(parseData); } function parseData(data: any) { return platformBrowser([{ provide: CONfig_TOKEN,useValue: data }]).bootstrapModuleFactory(AppModuleNgFactory); }
在我的main.ts文件中,我调用webservice来获取配置数据,解析数据并创建一个提供程序以传递到我的应用程序中.我将凭据设置为包括因为我在webservice上使用Windows身份验证,当您没有明确告诉fetch提供凭据时,它将提供401.
app.component.ts
import { Component,OnInit,Inject } from "@angular/core"; import { CONfig_TOKEN } from './shared/constants/constants' @Component({ selector: "app",templateUrl: "app.component.html" }) export class AppComponent implements OnInit { public configuration: any; public isAdmin: boolean; constructor(@Inject(CONfig_TOKEN) config: any) { this.configuration = config; } ngOnInit() { this.isAdmin = this.configuration.currentUser_IsAdmin; } }
在我的app.component中,我可以注入我创建的提供程序以使用我从webservice获得的配置对象.
打字稿问题
在开发此解决方案时,我在visual studio中遇到了打字稿问题,我收到以下错误:
error TS2304: Cannot find name 'fetch'.
我通过手动下载whatwg-fetch typescript定义文件解决了这个问题
npm install --save-dev @types/whatwg-fetch
@DzmitryShylovich,谢谢你的帮助!
以上是大佬教程为你收集整理的在Angular 2应用程序开始使用AoT之前从数据库加载配置全部内容,希望文章能够帮你解决在Angular 2应用程序开始使用AoT之前从数据库加载配置所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。