当前位置: 首页 > 知识库问答 >
问题:

Angularjs2 - 在应用程序启动之前预加载服务器配置 [复制]

梁鸣
2023-03-14

我正在使用Angular2RC5。我希望能够在我的应用程序启动之前加载我的服务器IP地址和一些其他配置参数。我如何在最新的RC5中做到这一点?

我看过其他文章,但没有帮助:

  1. 如何在angular2中预加载配置文件:这里提供的答案是特定于webpad的。我正在使用系统js。
  2. https://medium.com/@hasan.hameed/reading-configuration-files-in-angular-2-9d18b7a6aa4#.m8lontnas:这是旧版本的Angular2。使用的一些类已被弃用。

任何帮助都将不胜感激。

编辑

我尝试在我的app.module.ts中使用APP_INITIALIZER,如下所示:

    import { NgModule, provide, APP_INITIALIZER }       from "@angular/core";
    import { ConfigService } from "./shared/services/config.service";
    @NgModule({
        declarations: [AppComponent],
        imports: [BrowserModule,
            routes,
            FormsModule,
            HttpModule],
        providers: [AuthService,
            Title,
            appRoutingProviders,
            ConfigService],
        bootstrap: [AppComponent
            , provide(APP_INITIALIZER,
                {
                    useFactory: (config: ConfigService) => () => config.load(),
                    deps: [ConfigService], multi: true
                })]
    })
    export class AppModule { }

这是我的配置服务。ts文件:

    import { Config } from "../model/config";

    export class ConfigService {
        constructor() {
        }

        load(): Promise<Config> {
            let config: Config = new Config("localhost", "5050");
            return Promise.resolve(config);
        }
    }

请注意,我最终将重新写入加载以实际读取属性或某些此类文件以加载配置。

这是config.ts的样子:

export class Config {

    constructor(
        private machine: string,
        private port: string
    ) {
    }

    private base_url: string = "http://" + this.machine +
    this.port + "/";

    public loginURL: string = this.base_url + "login";
}

我收到一个编译错误

public/app/app.module.ts(27,11): error TS2345: Argument of type '{ declarations: (typeof AppComponent ...' is not assignable to parameter of type 'NgModuleMetadataType'.
  Types of property 'bootstrap' are incompatible.
    Type '(typeof AppComponent | Provider)[]' is not assignable to type '(Type | any[])[]'.
      Type 'typeof AppComponent | Provider' is not assignable to type 'Type | any[]'.
        Type 'Provider' is not assignable to type 'Type | any[]'.
          Type 'Provider' is not assignable to type 'any[]'.
            Property '[Symbol.iterator]' is missing in type 'Provider'.

编辑 2

我继续下一步。更新 ConfigService 以使用 http.get 读取 json 文件。现在我收到一个错误。以下是更新的文件:

export class ConfigService {
    private config: Config;
        constructor(private http: Http) {
    }

    load(): Promise<Config> {
            this.http.get("/blah/config.json")
                 .map(res => res.json())
                 .subscribe((env_data) => {
                     console.log(env_data);
                  });
        this.config = new Config("localhost", "5050");
        return Promise.resolve(this.config);
    }

    getConfig(): Config {
        return this.config;
    }
}

这是 NgModule 类中的提供程序部分

    providers: [AuthService,
    Title,
    appRoutingProviders,
    ConfigService,
    {
        provide: APP_INITIALIZER,
        useFactory: (config: ConfigService) => () => config.load(),
        deps: [ConfigService, Http],
        multi: true
    }],

请注意,在RC6中,我无法导入HTTP_PROVIDERS,因为我收到错误消息,即这些不再在超文本传输协议模块中定义。这就是我尝试Http的原因。

在运行时,我得到以下错误

(index):27 Error: Error: Can't resolve all parameters for ConfigService: (?).(…)(anonymous function) @ (index):27
ZoneDelegate.invoke @ zone.js:332
Zone.run @ zone.js:225(anonymous function) @ zone.js:591
ZoneDelegate.invokeTask @ zone.js:365
Zone.runTask @ zone.js:265
drainMicroTaskQueue @ zone.js:497
ZoneTask.invoke @ zone.js:437

共有1个答案

郤飞英
2023-03-14

在你的根模块中提供这个

{provide: APP_INITIALIZER, useValue: () => promise, multi: true}]}

其中<代码>()=

另请参阅如何将呈现的参数从后端传递到 angular2 引导方法

可以将服务作为依赖项传递,您可以在其中存储结果。

更新

export function loadConfig(config: ConfigService) => () => config.load()

@NgModule({
        declarations: [AppComponent],
        imports: [BrowserModule,
            routes,
            FormsModule,
            HttpModule],
        providers: [AuthService,
            Title,
            appRoutingProviders,
            ConfigService,
            { provide: APP_INITIALIZER,
              useFactory: loadConfig,
              deps: [ConfigService], 
              multi: true }
        ],
        bootstrap: [AppComponent]
    })
    export class AppModule { }

更新2

普伦克示例

 类似资料:
  • 我有一个Spring Boot 1.4.2应用程序。启动期间使用的一些代码如下所示: 有一个组件决定系统类型。此组件在从其他组件启动期间使用。在生产中,一切正常。 现在,我想使用Spring1.4的MockBean添加一些集成测试。 测试如下所示: 基本上,模拟效果很好。使用我的systemTypeDetectorMock,如果我调用getSystemType- 问题是应用程序没有启动。目前Spr

  • 我试图集成一个旧的weblogic应用程序来使用Okta SSO saml2.0流。我已经成功地使用@ServletCompenentScan将应用程序与Spring Boot集成,并且能够成功地使用Spring Security性进行基本身份验证。但是,当将特定于SAML的配置添加到SecurityConfiguration时,应用会在部署时失败。对于okta saml,我遵循这个教程https

  • 我正在尝试集成一个旧的weblogic应用程序来使用Okta SSO SAML2.0流。我已经使用@ServletCompenentScan成功地将应用程序与spring boot集成,并且能够成功地使用spring security进行基本身份验证。但是,当向SecurityConfiguration添加特定于SAML的配置时,应用程序在部署时会失败。关于okta saml,我将遵循本教程htt

  • 我有一个建立在Spring启动基础上的后端,然后我学校的一些定制代码建立在这个基础上。前端是纯粹的角度应用程序,我从不同的服务器上通过一大口服务提供。他们只通过REST调用连接。 后端已经运行了一个身份验证模块,现在我需要从后端运行的同一tomcat服务器为这个角应用程序提供服务,这样它也可以使用这个身份验证模块。 我发现这是关于多个连接器的,所以我将其复制为以下类来设置多个连接器: 问题是我没有