используя инъекционный сервис для настройки конфигурации APP_BASE_HREF

Я пишу угловой проект 2.1.0 с машинописью 2.0.3.

Я создал службу app-config со следующим кодом:

import { Injectable } from '@angular/core';

@Injectable()
export class AppConfigService {
  public config: any = {
    auth0ApiKey: '<API_KEY>',
    auth0Domain: '<DOMAIN>',
    auth0CallbackUrl: '<CALLBACK_URL>',
    appBaseHref: '/'
  }

  constructor() {}

  /* Allows you to update any of the values dynamically */
  set(k: string, v: any): void {
    this.config[k] = v;
  }

  /* Returns the entire config object or just one value if key is provided */
  get(k: string): any {
    return k ? this.config[k] : this.config;
  }
}

теперь я хочу использовать этот инъекционный сервис на своем app-module.ts, чтобы установить поставщика APP_BASE_HREF.

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';
import { AppComponent } from './app/app.component';
import { HelpComponent } from './help/help.component';
import { WelcomeComponent } from './welcome/welcome.component';
import {APP_BASE_HREF} from "@angular/common";
import { MaterialModule } from "@angular/material";
import { AUTH_PROVIDERS }      from "angular2-jwt";
import { RouterModule }  from "@angular/router";
import {AppConfigService} from "app-config.service";

const appConfigService = new AppConfigService();    

@NgModule({
  declarations: [
    AppComponent,
    HelpComponent,
    WelcomeComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    MaterialModule.forRoot(),
    RouterModule.forRoot([
      { path: "",redirectTo:"welcome",pathMatch:"full"},
      { path: "welcome", component: WelcomeComponent },
      { path: "help",component: HelpComponent},
      { path: "**",redirectTo:"welcome"}
    ])
  ],
  providers: [AUTH_PROVIDERS,{provide: APP_BASE_HREF, useValue:appConfigService.get('appBaseHref')}],bootstrap: [AppComponent]
})
export class AppModule {
}

поэтому здесь я инициирую класс в константу и использую его. есть ли способ сделать инъекцию классным и сексуальным способом?

например, для моей службы аутентификации я определил ее в конструкторе

constructor(@Inject(AppConfigService) appConfigService:AppConfigService)

здесь тоже есть способ сделать что-то сексуальное? или просто оставить как есть?

спасибо


person ufk    schedule 15.10.2016    source источник


Ответы (1)


Вы можете использовать фабрику для APP_BASE_REF

providers: [
  AppConfigService,
  {
    provide: APP_BASE_HREF,
    useFactory: (config: AppConfigService) => {
      return config.get('appBaseHref')
    },
    deps: [ AppConfigService ]
  }
]

Как только вы добавите AppConfigService к провайдерам, он станет доступным как для фабрики, так и для службы аутентификации. В общем, так и должно быть сделано. Позже, если, скажем, AppConfigService потребуются некоторые зависимости, возможно, это будет обработано через систему впрыска.

См. также:

person Paul Samsotha    schedule 15.10.2016
comment
Я не знаю, как этот ответ будет принят, если это не сработает. Вы пробовали перед публикацией? - person mightymatth; 09.11.2020