Change agm-map google maps API Key dynamic in Angular 7
Change agm-map google maps API Key dynamically in Angular 7
我正在构建一个允许您编辑地图的应用程序,编辑器有 google 个带有 Agm 地图模块的地图,用户的最终结果是一个带有地图的 iframe 嵌入到他的网页中。
我正在为编辑器使用该模块,并在 app.module.ts 中使用我的 API 键导入它。
import { AgmCoreModule } from '@agm/core';
...
imports: [
...
AgmCoreModule.forRoot({
apiKey: 'YOUR_KEY'
})
]
iframe 将是一个单独的 angular 应用程序,使用相同的后端。我需要将从数据库中获取的用户 API 密钥,但我无法理解如何在 Angular 中构建此部分,它似乎使用 api 键,是否可以通过在运行时修改键的方式来实现?我在 jQuery 看到它完成了。在哪里可以从脚本标签中的代码中获取,或者在 vanilla js 中,例如:
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
</script>
在最后一个示例中,可以轻松完成,
谢谢
我确实立即解决了它,在我的情况下,我使用此代码从 API 获得了密钥
import { AgmCoreModule, LAZY_MAPS_API_CONFIG, LazyMapsAPILoaderConfigLiteral }
from '@agm/core';
export function agmConfigFactory(http: HttpClient, config: LazyMapsAPILoaderConfigLiteral) {
const id = window.location.pathname.replace(/\//g, "");
return () => http.get<any>(`${environment.baseUrl}/map-display/${id}`).pipe(
map(response => {
config.apiKey = response.key;
return response;
})
).toPromise();
}
api调用的内容和id可以用想要的key代替。
import { AgmCoreModule, LAZY_MAPS_API_CONFIG, LazyMapsAPILoaderConfigLiteral }
from '@agm/core';
@Injectable()
export class GoogleMapsConfig implements LazyMapsAPILoaderConfigLiteral {
apiKey: string = CONFIG.googleMapsAPIKey;
}
您必须在@NgModule 的提供程序数组中添加一个指定函数的提供程序,在我的例子中:
providers: [
{
provide: APP_INITIALIZER,
useFactory: agmConfigFactory,
deps: [HttpClient, LAZY_MAPS_API_CONFIG],
multi: true
}
],
对于我展示的通用示例,您可以使用 Class 而不是 useFactory。
你仍然需要在@NgModule 的导入数组中提供一个初始键,它可以是一个无意义的字符串
AgmCoreModule.forRoot({ apiKey: "initialKey"}),
添加到上面的答案,添加以下内容以使自动完成工作
AgmCoreModule.forRoot({
apiKey: 'initialKey',
language: 'en',
libraries: ['places']
}),
我正在构建一个允许您编辑地图的应用程序,编辑器有 google 个带有 Agm 地图模块的地图,用户的最终结果是一个带有地图的 iframe 嵌入到他的网页中。 我正在为编辑器使用该模块,并在 app.module.ts 中使用我的 API 键导入它。
import { AgmCoreModule } from '@agm/core';
...
imports: [
...
AgmCoreModule.forRoot({
apiKey: 'YOUR_KEY'
})
]
iframe 将是一个单独的 angular 应用程序,使用相同的后端。我需要将从数据库中获取的用户 API 密钥,但我无法理解如何在 Angular 中构建此部分,它似乎使用 api 键,是否可以通过在运行时修改键的方式来实现?我在 jQuery 看到它完成了。在哪里可以从脚本标签中的代码中获取,或者在 vanilla js 中,例如:
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
</script>
在最后一个示例中,可以轻松完成, 谢谢
我确实立即解决了它,在我的情况下,我使用此代码从 API 获得了密钥
import { AgmCoreModule, LAZY_MAPS_API_CONFIG, LazyMapsAPILoaderConfigLiteral }
from '@agm/core';
export function agmConfigFactory(http: HttpClient, config: LazyMapsAPILoaderConfigLiteral) {
const id = window.location.pathname.replace(/\//g, "");
return () => http.get<any>(`${environment.baseUrl}/map-display/${id}`).pipe(
map(response => {
config.apiKey = response.key;
return response;
})
).toPromise();
}
api调用的内容和id可以用想要的key代替。
import { AgmCoreModule, LAZY_MAPS_API_CONFIG, LazyMapsAPILoaderConfigLiteral }
from '@agm/core';
@Injectable()
export class GoogleMapsConfig implements LazyMapsAPILoaderConfigLiteral {
apiKey: string = CONFIG.googleMapsAPIKey;
}
您必须在@NgModule 的提供程序数组中添加一个指定函数的提供程序,在我的例子中:
providers: [
{
provide: APP_INITIALIZER,
useFactory: agmConfigFactory,
deps: [HttpClient, LAZY_MAPS_API_CONFIG],
multi: true
}
],
对于我展示的通用示例,您可以使用 Class 而不是 useFactory。 你仍然需要在@NgModule 的导入数组中提供一个初始键,它可以是一个无意义的字符串
AgmCoreModule.forRoot({ apiKey: "initialKey"}),
添加到上面的答案,添加以下内容以使自动完成工作
AgmCoreModule.forRoot({
apiKey: 'initialKey',
language: 'en',
libraries: ['places']
}),