์ฑ๊ธ ํค ๊ตฌ์ฑ ์๋น์ค์ Google API ํค๊ฐ ์์ต๋๋ค (๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ ๊ตฌ์ฑ์ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ).
@NgModule ๋ด๋ถ์ ๋ชจ๋์ apiKey ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ ๋ฌํ ์ ์์ต๋๊น?
`@NgModule ({
์์
ํ : [
BrowserModule,
CommonModule,
FormsModule,
AgmCoreModule.forRoot ({
apiKey : 'YOUR_KEY'// <-์์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค !!! ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ ๋ฌํ ์ ์์ต๋๊น?
})
],
๊ณต๊ธ์ : [],
์ ์ธ : [AppComponent],
๋ถํธ ์คํธ๋ฉ : [AppComponent]
})`
์ฌ์ฉ์ค์ธ ๋น๋ ๋๊ตฌ์ ์ข
๋ฅ (์ : angular-cli ๋๋ ์ฌ์ฉ์ ์ง์ ์นํฉ ๋๋ ...)์ ๋ณ์์ ์ถ์ฒ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค.
์ด๊ฒ์ ์ฝ๊ฐ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค. ํนํ @NgModule
๋ด๋ถ์ ๋๋ฌด ๋ง์ ๋์ ์ฝ๋๋ฅผ ๋ฐฉ์งํ๋ AOT ์ปดํ์ผ์ ์ฌ์ฉํ๊ณ ์ถ์ ๋.
ํ์ฌ ๊ตฌํ ํ ์๋ฃจ์ ์ ๊ธฐ๋ณธ app.module์์ 'lazy config provider'๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ ๋๋ค.
์ค์ ๋ก ๋งต์ ์ฌ์ฉํ๋ ๋ชจ๋์์๋ forRoot์ ๋น ๊ตฌ์ฑ์ ์ฌ์ฉํฉ๋๋ค.
AgmCoreModule.forRoot()
๋ด app.module.ts์์ :
์ฃผ์
ํ ํฐ ๊ฐ์ ธ ์ค๊ธฐ :
import { LAZY_MAPS_API_CONFIG }
from 'angular2-google-maps/core/services';
@NgModule
์ ๊ณต ์
์ฒด์ ์ถ๊ฐ :
providers: [
{provide: LAZY_MAPS_API_CONFIG, useClass: GoogleMapsConfig}
],
๊ทธ๋ฆฌ๊ณ LazyMapsAPILoaderConfigLiteral
์ธํฐํ์ด์ค ( 'angular2-google-maps / core / services'์ '์์)๋ฅผ ๊ตฌํํด์ผํ๋'GoogleMapsConfig 'ํด๋์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
@Injectable()
class GoogleMapsConfig {
apiKey: string;
...
constructor() {
apiKey = getMyApiKeyFromSomewhere()
...
}
}
๊ทธ ์ฃผ์
ํ์์ ๋ค๋ฅธ ์๋น์ค๋ฅผ ์ฃผ์
ํ๊ณ ์ด๋๊ฐ์์ ๊ตฌ์ฑ์ ์ฝ์ ์ ์์ต๋๋ค.
(์๋ฅผ ๋ค์ด angular-cli๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฑฐ๊ธฐ์์ ํ๊ฒฝ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค). ๋๋ ๋ธ๋ผ์ฐ์ ์์ ๋๋ฉ์ธ์ ์ฝ๊ฑฐ๋ ์๋ฒ ์ธก API๋ฅผ ํธ์ถ ํ ์ ์์ต๋๋ค.
๋๋ ์์ ๊ฒ์ ์๋ํ์ต๋๋ค. AoT ์ค๋ฅ๋ฅผ ํผํ ์ ์์ง๋ง API ํค๊ฐ Google์ง๋์ ์ ๋ฌ๋์ง ์์ผ๋ฏ๋ก ํค ๋๋ฝ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ด ์ฌ์ฉ ์ฌ๋ก์์๋ extended-define-webpack-plugin ์ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ์๊ฐ ์ ์ญ ๊ตฌ์ฑ ์ค์ (๋น๋ ์ ํ ๋ฑ์ ๋ฐ๋ผ ๋ณ๊ฒฝ ๋ ์์๋ API ํค)์ ์ถ๊ฐํ๊ณ ์์ต๋๋ค.
import { LAZY_MAPS_API_CONFIG, LazyMapsAPILoaderConfigLiteral } from 'angular2-google-maps/core/services';
@Injectable()
export class GoogleMapsConfig implements LazyMapsAPILoaderConfigLiteral {
apiKey: string = CONFIG.googleMapsAPIKey;
}
@NgModule({
declarations: [...],
imports: [...],
providers: [{provide: LAZY_MAPS_API_CONFIG, useClass: GoogleMapsConfig}],
bootstrap: [AppComponent]
})
export class AppModule {}
๊ทธ๋ฆฌ๊ณ ์ง๋๋ฅผ ์ฌ์ฉํ๋ ์ง์ฐ๋ก๋ ๋ ๋ชจ๋์์ AgmCoreModule.forRoot()
ํธ์ถํฉ๋๋ค.
์ ๋ angular 4์ CLI 1.0.2๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. @kyranjamie ์์ ์์ ์ฝ๋๋ฅผ ์ป์ผ๋ ค๊ณ ํ๋๋ฐ ์ด๊ฒ์ด ์๋ํ๋๋ก ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์๋ํ๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก prod์ dev์ ๋ํด ๋ค๋ฅธ ํค๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ๋ด ์ฝ๋์ ๋๋ค. ๋ด๊ฐ ๋ญ ์๋ชปํ๊ณ ์์ต๋๊น?
`
@Injectable ()
๋ด๋ณด๋ด๊ธฐ ํด๋์ค GoogleMapsConfig implements LazyMapsAPILoaderConfigLiteral {
๊ณต๊ฐ apiKey : ๋ฌธ์์ด;
constructor () {
if (environment.production) {
this.apiKey = ์ฌ๊ธฐ์ ์ฝ์
๋ ํค
};
}
}
@NgModule ({
์ ์ธ : [
AppComponent
],
์์
ํ : [
BrowserModule,
FormsModule,
ReactiveFormsModule,
HttpModule,
AppRoutingModule,
NgbModule.forRoot (),
NouisliderModule,
AgmCoreModule.forRoot ()
],
์ ๊ณต ์
์ฒด : [
{์ ๊ณต : LAZY_MAPS_API_CONFIG, useClass : GoogleMapsConfig}
],
๋ถํธ ์คํธ๋ฉ : [AppComponent]
})
export class AppModule {
}
`
if (environment.production)
์ด (๊ฐ) ์ง์ค๋ก ํด๊ฒฐ ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๊น?
๊ทํ์ ์๊ฒฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@daBishMan ๋๋ @kyranjamie , ์ฌ๋ฌ๋ถ์ด ์ด๊ฒ์ ์์ ๋ธ ์ ์ด ์๋ค๋ฉด ์ต์ข ์๋ฃจ์ ์ ๊ฒ์ ํ ์ ์์ต๋๊น? @kyranjamie , ๋ด ๋ฌธ์ ๊ฐ ๊ทํ์ ๋ฌธ์ ์ ์ ์ฌํ ๊ฒ ๊ฐ์ต๋๋ค. AOT๊ฐ ๊ด๋ จ๋ ์ ํ ๋น๋์์ maps.google.com์ ๋ํ ์์ฒญ์ agm-map ์ด๊ธฐํ, ... URL API-KEY ๋งค๊ฐ ๋ณ์๊ฐ ์ ์ก๋์ง ์์ต๋๋ค. . ๋ฐ๋ผ์ "missing api key"์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
@ jorrit-wehelp, ๊ทํ์ ์๋ด์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ๋๋ฅผ ์ํด ์ผํ๋ ๊ฒ์ ์๋์ ํฌํจ์ํค๊ณ ์์ต๋๋ค ....
import {Injectable} from "@angular/core";
import {LazyMapsAPILoaderConfigLiteral} from "@agm/core";
import {Config} from "../providers/config";
@Injectable()
export class MapsConfig implements LazyMapsAPILoaderConfigLiteral{
public apiKey: string
public libraries: string[]
constructor(config: Config) {
this.apiKey = config.get("MAP_API_JS_KEY")
this.libraries = ['places']
console.log("lazy map init with " + this.apiKey)
}
}
๋ด ์ฃผ @ngmodule ์์ ๊ณต๊ธ์์ ์ด๊ฒ์ ๊ฐ์ง๊ณ ์์ต๋๋ค ...
{
provide: LAZY_MAPS_API_CONFIG,
useClass: MapsConfig,
deps: [Config]
}
Config ํด๋์ค์ ๋ํ ์ฐธ์กฐ๋ Dev ๋๋ Prod ๋ชจ๋์์ ์ฌ์ฉ๋๋ ๋ณ์ ๋งต์ ์ค์ ์ ์ค์ ํ๋ ๋น๋ ํ์ ์นํฉ ๋ณ์ ๋์ฒด์ ๋๋ค.
์๋ ํ์ธ์
@ jorrit-wehelp ์ฃผ์๊ณผ ๊ฐ์ด ๋์ ํค๋ฅผ ์ป์ ์ ์์์ง๋ง ์ฌ์ฉ์ ๋ก๊ทธ ์์ ๋ฐ ๋ก๊ทธ์ธ ํ ์๋๋ฆฌ์ค์์ agmKey ๊ฐ์ด ์ ๋ฐ์ดํธ๋์ง ์๊ณ ์ง๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๋ชจ๋ ๊ตฌ์ฑ ์์์์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๊ทธ๋์ class GoogleMapsConfig
์ {provide: LAZY_MAPS_API_CONFIG, useClass: GoogleMapsConfig}
๋ฅผ์ง๋ @component
์์์ ์ฎ๊ฒผ์ต๋๋ค.
```...
'@ agm / core'์์ {LAZY_MAPS_API_CONFIG, LazyMapsAPILoaderConfigLiteral} ๊ฐ์ ธ ์ค๊ธฐ;
'@ pl-core / _services'์์ {AuthService} ๊ฐ์ ธ ์ค๊ธฐ
@Injectable ();
class GoogleMapsConfig implements LazyMapsAPILoaderConfigLiteral {
๊ณต๊ฐ apiKey : ๋ฌธ์์ด;
constructor () {
console.log ( '๋ด๋ถ ๋งต'); // ์ฝ์์ ํ์๋์ง ์์ต๋๋ค.
this.apiKey = _authService.currentUser () && _authService.currentUser (). agmKey? _authService.currentUser (). agmKey : '';
_authService.getMapKey $ .subscribe ((key) => {
this.apiKey = ํค;
})
}
}
@๊ตฌ์ฑ ์์({
์ ํ๊ธฐ : 'map-comp',
templateUrl : './dyn-map.component.html',
styleUrls : [ './dyn-map.component.scss'],
์ ๊ณต ์
์ฒด : [{provide : LAZY_MAPS_API_CONFIG, useClass : GoogleMapsConfig}],
์บก์ํ : ViewEncapsulation.None
})
```
๋ก๊ทธ ์์ํ๊ณ ๋ค๋ฅธ ์ฌ์ฉ์๋ก ๋ก๊ทธ์ธ ํ ํ ์ปจํธ๋กค์ด GoogleMapsConfig ํด๋์ค์ ํฌํจ๋์ง ์์ต๋๋ค.์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ด๋ป๊ฒํด์ผํฉ๋๊น ??
@ jorrit-wehelp์ ์๋ฃจ์
์ด ์๋ํ์ง๋ง API ํค๋ฅผ ๋ฐํํ๋ ๋ด ์๋น์ค๊ฐ ํญ์ ์ ๋์ ๊ทธ๊ฒ์ ๋ฐํํ์ง๋ ์๋ ๊ฒฝ์ ์กฐ๊ฑด์ด ์์๊ธฐ ๋๋ฌธ์ ๊ฐํ์ ์ผ๋ก ๋ง
๋ด์ง๋ ๊ตฌ์ฑ ์์์ ์์ฑ์ :
constructor(private envService: EnvironmentService) {
this.envService.environment$.subscribe(environment => {
// setTimeout is to wait a beat since my GoogleMapsConfig receives
// the key at the same instant.
setTimeout(() => this.gmapsApiKeyReady = true);
});
}
๊ทธ๋ฐ ๋ค์ ๋งํฌ ์ ์์ :
<agm-map *ngIf="gmapsApiKeyReady" ...></agm-map>
์ด๊ฒ์ด ๋ชจ๋ ์ฌ๋์๊ฒ ์ ์ฉ๋๋์ง ๋๋ ์ฌ๋ก๋ณ๋ก ๋ ๋ง์ด ์ ์ฉ๋๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด๊ฒ์ด agm ์์ฒด์ ๋ฌธ์ ๊ฐ ์๋๋ผ Angular์ AOT ์ปดํ์ผ ํ๋ก์ธ์ค์ ๊ฒฐ๊ณผ์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ค์์ ๋ด๊ฐ ๊ฒช์ ์ํฉ์ ๋ํ ๊ฐ์์ ๋๋ค.
ํ๋ ์ฝ๋ฉ ๋ ๋ฌธ์์ด ๋์ API ํค ๊ตฌ์ฑ์ ๊ตฌ๋ํ์ฌ ๋ค๋ฅธ ํ๊ฒฝ์ ํตํด ์ด๋ํ๋ฉด ๋ค๋ฅธ API ํค๋ฅผ ์ฌ์ฉํ๊ณ API ์ฌ์ฉ์ ๋ชจ๋ํฐ๋ง ํ ์ ์๊ธฐ๋ฅผ ์ํ์ต๋๋ค. ์ด๋ฅผ ์ํด .NET ๋ฐฑ์๋์ ํ์ํ ๊ฐ์ Example.Namespace.GoogleMapsApiKey
์ ์ฅ๋ ์ ์ญ ๋ค์ ์คํ์ด์ค์ JavaScript๋ก ์ฃผ์
ํ์ต๋๋ค. ์ด๋ฅผ ์ผ๋์๋๊ณ ์ฌ๊ธฐ์ TypeScript ์ฝ๋๊ฐ ์์ต๋๋ค.
// typings.d.ts
declare namespace Example.Namespace {
export const GoogleMapsApiKey: string;
}
// app.module.ts
import { AgmCoreModule } from "@agm/core";
import { NgModule } from "@angular/core";
@NgModule({
// ...
imports: [
AgmCoreModule.forRoot({
apiKey: Example.Namespace.GoogleMapsApiKey,
})
],
// ...
})
export class AppModule {}
ํ์ํ ๊ฐ์ผ๋ก ์ผ๋ถ const ์ ์ญ ๋ณ์์ ๋ํ ์ ํ ์ ์๋ฅผ ๋ง๋๋ ๊ฒ์ด AOT ๋น๋ ํ๋ก์ธ์ค ์ค์ ํฌํจ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ AOT ์ปดํ์ผ๋ฌ ๋ TypeScript ๋๊ตฌ์ ํ์ ์งํฉ ๋ง ์ด๊ธฐํ ๋ ๋ณ์ ๋ฐ ์์ ๋ง "์ค๋ฅ์์ต๋๋ค. ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ผ์ข
์ LAZY_MAPS_API_CONFIG
๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํํ๋ฉด ์ฑ๊ณต์ ์ผ๋ก ์ํ ํ ์์์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ค๋๋ ๊ฒ์ผ๋ก ํ์๋์์ต๋๋ค. ๋ ์ด์ ํ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ํ์๋ฉ๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌ์ฉ์ค์ธ ๋น๋ ๋๊ตฌ์ ์ข ๋ฅ (์ : angular-cli ๋๋ ์ฌ์ฉ์ ์ง์ ์นํฉ ๋๋ ...)์ ๋ณ์์ ์ถ์ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
์ด๊ฒ์ ์ฝ๊ฐ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค. ํนํ
@NgModule
๋ด๋ถ์ ๋๋ฌด ๋ง์ ๋์ ์ฝ๋๋ฅผ ๋ฐฉ์งํ๋ AOT ์ปดํ์ผ์ ์ฌ์ฉํ๊ณ ์ถ์ ๋.ํ์ฌ ๊ตฌํ ํ ์๋ฃจ์ ์ ๊ธฐ๋ณธ app.module์์ 'lazy config provider'๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ ๋๋ค.
์ค์ ๋ก ๋งต์ ์ฌ์ฉํ๋ ๋ชจ๋์์๋ forRoot์ ๋น ๊ตฌ์ฑ์ ์ฌ์ฉํฉ๋๋ค.
๋ด app.module.ts์์ :
์ฃผ์ ํ ํฐ ๊ฐ์ ธ ์ค๊ธฐ :
@NgModule
์ ๊ณต ์ ์ฒด์ ์ถ๊ฐ :๊ทธ๋ฆฌ๊ณ
LazyMapsAPILoaderConfigLiteral
์ธํฐํ์ด์ค ( 'angular2-google-maps / core / services'์ '์์)๋ฅผ ๊ตฌํํด์ผํ๋'GoogleMapsConfig 'ํด๋์ค๋ฅผ ๊ตฌํํฉ๋๋ค.๊ทธ ์ฃผ์ ํ์์ ๋ค๋ฅธ ์๋น์ค๋ฅผ ์ฃผ์ ํ๊ณ ์ด๋๊ฐ์์ ๊ตฌ์ฑ์ ์ฝ์ ์ ์์ต๋๋ค.
(์๋ฅผ ๋ค์ด angular-cli๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฑฐ๊ธฐ์์ ํ๊ฒฝ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค). ๋๋ ๋ธ๋ผ์ฐ์ ์์ ๋๋ฉ์ธ์ ์ฝ๊ฑฐ๋ ์๋ฒ ์ธก API๋ฅผ ํธ์ถ ํ ์ ์์ต๋๋ค.