为什么我无法在 Angular 2 组件中加载谷歌地图?

2024-02-21

这是我的 ts 组件:

import {Component, OnInit,  Output, EventEmitter} from '@angular/core';

    declare var google: any;

    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css'],
    })


    export class AppComponent implements OnInit {
      title = 'Dashboard';
      private map: any;


        constructor() {
          let brussels = new google.maps.LatLng(50.82, 4.35);
          var mapOptions = {
            zoom: 9,
            center: brussels
          };
          this.map = new google.maps.Map(document.getElementById('googleMap'), mapOptions);

          var marker = new google.maps.Marker({
            position: brussels
          });
          //google.maps.event.addListener(marker, 'click', ( () => this.select.next("i was a map click")) )
          marker.setMap(this.map);

        }

      ngOnInit(){

      }

这是我的html:

<h1>
  {{title}}
</h1>
<div id="googleMap"></div>
<div id="legend-container"><h3>Legend</h3></div>
<div id="info-box" style="">?</div>

我在主index.html 中声明了谷歌地图的api 密钥。问题是我似乎无法将谷歌地图加载到组件中。控制台出现错误主要有以下几种:

error_handler.js:45 EXCEPTION: Error in ./AppComponent class AppComponent_Host - inline template:0:0 caused by: google is not definedErrorHandler.handleError @ error_handler.js:45(anonymous function) @ application_ref.js:209ZoneDelegate.invoke @ zone.js:192onInvoke @ ng_zone_impl.js:43ZoneDelegate.invoke @ zone.js:191Zone.run @ zone.js:85(anonymous function) @ zone.js:451ZoneDelegate.invokeTask @ zone.js:225onInvokeTask @ ng_zone_impl.js:34ZoneDelegate.invokeTask @ zone.js:224Zone.runTask @ zone.js:125drainMicroTaskQueue @ zone.js:357
error_handler.js:47 ORIGINAL EXCEPTION: google is not definedErrorHandler.handleError @ error_handler.js:47(anonymous function) @ application_ref.js:209ZoneDelegate.invoke @ zone.js:192onInvoke @ ng_zone_impl.js:43ZoneDelegate.invoke @ zone.js:191Zone.run @ zone.js:85(anonymous function) @ zone.js:451ZoneDelegate.invokeTask @ zone.js:225onInvokeTask @ ng_zone_impl.js:34ZoneDelegate.invokeTask @ zone.js:224Zone.runTask @ zone.js:125drainMicroTaskQueue @ zone.js:357
error_handler.js:50 ORIGINAL STACKTRACE:ErrorHandler.handleError @ error_handler.js:50(anonymous function) @ application_ref.js:209ZoneDelegate.invoke @ zone.js:192onInvoke @ ng_zone_impl.js:43ZoneDelegate.invoke @ zone.js:191Zone.run @ zone.js:85(anonymous function) @ zone.js:451ZoneDelegate.invokeTask @ zone.js:225onInvokeTask @ ng_zone_impl.js:34ZoneDelegate.invokeTask @ zone.js:224Zone.runTask @ zone.js:125drainMicroTaskQueue @ zone.js:357
error_handler.js:51 ReferenceError: google is not defined

任何建议都将受到高度赞赏:)


谷歌地图 API 尚未加载,您应该异步加载它,并在加载后初始化地图。看一眼这个问题 https://stackoverflow.com/questions/16340529/loading-google-maps-asynchronously关于异步加载谷歌地图。

正如 @Günter Zöchbauer 所说,您应该在初始化视图后初始化地图。 (在ngAfterViewInit)

像这样的东西:

export class AppComponent implements AfterViewInit {
  title = 'Dashboard';
  private map: any;

  constructor(private el:ElementRef) {
  }
  onMapsReady(){
    let brussels = new google.maps.LatLng(50.82, 4.35);
    var mapOptions = {
      zoom: 9,
      center: brussels
    };
    this.map = new google.maps.Map(this.el.nativeElement, mapOptions);
    var marker = new google.maps.Marker({
      position: brussels
    });
    //google.maps.event.addListener(marker, 'click', ( () => this.select.next("i was a map click")) )
    marker.setMap(this.map);
  }
  ngAfterViewInit(){
    (<any>window).googleMapsReady=this.onMapsReady.bind(this);
     var script = document.createElement("script");
    script.type = "text/javascript";
    document.getElementsByTagName("head")[0].appendChild(script);
    script.src = "http://maps.googleapis.com/maps/api/js?v=3&sensor=false&callback=googleMapsReady";

  }

}

NB:通过服务加载 API 会(好多)更好

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我无法在 Angular 2 组件中加载谷歌地图? 的相关文章

  • VueJS - 验证表单文件上传中的文件大小要求

    我正在使用 Bootstrap Vue 表单制作一个简单的表单 用户可以在其中上传文件 有没有办法验证使用 Vue 表单选择的文件的大小 我想阻止用户上传此类文件 我见过this https stackoverflow com questi
  • Angular 2延迟加载模块-服务不是单例

    我已经在我的应用程序中实现了延迟加载模块 app module ts 配置正确 NgModule declarations AppComponent HeaderComponent HomeComponent imports Browser
  • 我可以在 .split() 之后直接访问数组的第二个值吗?

    我有这个代码 var tmp this attr id split 我想将分割后的第二个值存储在 tmp 上 因此 如果 this attr id hello marco 我想在 tmp 中存储值 marco 而不是数组 当然 我想直接用一
  • 使用 javascript 在 IFrame 中打印 PDF 文件仅获取一页

    这是我打印 pdf 文件的代码 在这里 在打印时我只得到一页 我需要一个解决方案 function printPdf var ifr document getElementById frame1 PDF is completely load
  • tinyMCE - 将RemoveFormat限制为格式列表

    当前的tinyMCE版本 3 5 2 Hi 我正在开发一个自定义插件 可以添加和删除自定义格式 http www tinymce com tryit custom formats php 向当前选择添加格式很简单 但我做不到 找到删除多种格
  • 当位置从相对固定变为固定时,div 的宽度会发生变化

    当 div topNav 的位置样式从相对更改为固定时 其宽度会更改几个像素 我找到了一个 jquery 插件 http imakewebthings github com jquery waypoints 它可以优雅地执行我正在寻找的相同
  • 错误 [ERR_UNSUPPORTED_DIR_IMPORT]:尝试在本地启动 Nodejs 应用程序时导入目录

    我在尝试将我的应用程序部署到 Heroku 时陷入了一个循环 我的进口声明 例如import cors from cors 由于 无法在 Common JS 中加载 ES6 模块 错误 似乎阻止了应用程序在生产环境中启动 在本地运行得很好
  • 正则表达式问题 - 在字符串中查找数字

    我目前正在使用 JavaScript 从字段中获取字符串 在该字段中通常会有 宽度 56 空隙 67 我需要做的是识别 1 440 范围内的两个数字 并将它们放入两个不同的字段中 字段 1 宽度 字段 2 无效 我已经研究过正则表达式 到目
  • chrome.extension.getBackgroundPage() 函数示例

    我正在开发一个需要在后台运行的小型 Chrome 扩展 但是 我知道当我使用弹出窗口时这是不可能的 经过一番阅读后 似乎最好的选择是创建popup js为了运行background js using chrome extension get
  • 量角器检查元素是否不存在

    我在基于角度的网站中有一个设置可以打开和关闭下拉菜单 如果关闭 则不会显示在主页上 对于量角器 我需要检查开关关闭时该元素是否不存在 但是 我不应该陷入 未找到元素 错误 因为它是一组许多测试中的一个 我该怎么做 我曾尝试这样做 expec
  • 在 X 轴刻度上渲染 HTML

    我想在 D3 图表的 x 轴上渲染 HTML 基本上 我希望轴上的每个标签都是到数据中另一列的超链接 我试过了 x domain data map function d return a href d Name a 但它根本不起作用 我得到
  • AngularJS 1.4 中的一种绑定方式

    根据探索 Angular 1 3 一次性绑定 http blog thoughtram io angularjs 2014 10 14 exploring angular 1 3 one time bindings html 使用新语法就像
  • 如何从客户端 JavaScript 调用特定的 Node.js 方法

    在我的应用程序中 我在 node js 文件中创建了许多方法 我如何从客户端 JavaScript 调用特定方法 下面是我的node js 文件 exports method1 function exports method2 functi
  • 将 SVG 下载为 PNG 图像

    我想将 HTML 页面中的 SVG 元素下载为 PNG 格式 我尝试了此操作 但下载了一个空白的 PNG 图像 如何将我的 HTML SVG 下载为 PNG 我用过这个https bl ocks org biovisualize 81878
  • 如何检查令牌过期和注销用户?

    当用户单击注销按钮时 他 她可以自己注销 但是如果令牌过期 他 她就无法注销 因为在我的应用程序中 令牌在服务器端和前端都使用 当用户单击注销按钮时 如果令牌有效 则服务器和浏览器中的令牌都会被清除 当用户未注销并且他 她的令牌过期但未在浏
  • 使用验证器禁用 FormGroup

    I had formArray我的复选框checkboxForm 如果没有复选框 我需要禁用按钮提交checked 我在我的上实现了自定义验证器checkboxForm 这是我尝试过的 Ts file get formReceivedSum
  • iOS Javascript 引擎 parseFloat(1) 返回负数

    这段代码将使错误出现 function causeBug d var k var n parseFloat 1 var c Math abs d if n lt 0 k else k return k n function for var
  • 如何重启ngOnInit来更新Interpolation

    有办法重新启动吗ngOnInit 改变变量时 因为我想重新开始ngOnInit 改变时theme多变的 这是我的代码 设置 ts export class SettingsPage implements OnInit phraseColor
  • AngularJS 中的全局模拟对象用于 jasmine/karma 测试

    我有一个正在模拟进行单元测试的对象 基本上在我的测试文件中 我将其模拟如下 var mockObject mockMethod1 function return true mockMethod2 function return true b
  • 如何使用javascript取消设置变量? [复制]

    这个问题在这里已经有答案了 这是我到目前为止所尝试的 var nxt I am next window onscroll function var scr this pageYOffset if scr gt 400 console log

随机推荐

  • 将数组的元素向左旋转

    我正在尝试解决来自的 JavaScript 挑战杰希罗网 挑战是这样的 编写一个旋转函数来旋转数组的元素 全部 元素应向左移动一位 第 0 个元素 应该放在数组的末尾 旋转后的数组应该是 回 旋转 a b c 应该返回 b c a 我能想到
  • 使用 HDF5 进行大型数组存储(而不是平面二进制文件)是否具有分析速度或内存使用优势?

    我正在处理大型 3D 数组 我经常需要以各种方式对其进行切片以进行各种数据分析 典型的 立方体 可以约为 100GB 并且将来可能会变得更大 看来Python中大型数据集的典型推荐文件格式是使用HDF5 h5py或pytables 我的问题
  • 使用 Visual Studio 2010 Express 将 .doc 保存/转换为 .html

    我有一个 Word 文档文件夹 我想将其转换为 html 以便进一步处理 我只有 Visual Studio 2010 Express 版本 可以使用 Express 版本吗 我找到了如何进行转换的示例 但它们需要 Microsoft Of
  • 如何反转 Julia 中的字典?

    如果我有一本字典 比如 my dict Dict A gt one B gt two C gt three 反转键 值映射的最佳方法是什么 一种方法是使用推导式通过迭代键 值对并一路交换它们来构建新字典 julia gt Dict valu
  • Qt 和 QMake 构建目录

    我想从源代码树中构建 qt 和 qt 应用程序 你知道如何使用configure和qmake从命令行设置 obj目录吗 如果我正确理解问题你应该设置对象目录 http qt nokia com doc 4 5 qmake variable
  • 替换delphi中的组件类

    我知道我在某个地方看到过一个 hack 的例子 用于定义现有 VCL 组件的自定义版本 例如TButton or TEdit 具有相同的类名 并执行一些操作 以便 DFM Streamer 实例化您的版本而不是原始版本 不幸的是 我所处的情
  • Express-session 未在浏览器中设置 cookie

    所以我正在使用express session设置 cookie 和 session 的包 它还连接到我的 MongoDB 存储来存储会话 当用户登录时 会话会很好地存储在数据库中 但是浏览器中没有cookie 我的应用程序正在运行http
  • 如何检查下拉菜单是否被禁用?

    使用 jquery 如何简单地检查它是否是只读的 这就是我正在尝试的 item keydown function event alert event keyCode if event keyCode 13 ok click if dropL
  • 获取内容:找不到路径

    我正在尝试在 PowerShell 中编写一个脚本 该脚本在 foreach 循环中读取名称中包含 example 的特定文件夹中的所有唯一文件 问题是我试图将每个文件的内容保存在变量中但没有成功 尝试使用获取内容 file它会抛出以下错误
  • 从 PHP 创建 MySQL 用户和数据库

    有没有办法使用 PHP 创建一个新的 MySQL 数据库 一个新的 MySQL 用户并授予新用户对新数据库的权限 EDIT 应该指出 这是从一台服务器运行到另一台服务器 因此服务器 A 尝试在服务器 B 上安装数据库 用户 我有这个 con
  • fetch 给出一个空的响应主体

    我有一个 React Redux 应用程序 我正在尝试向服务器发出一个简单的 GET 请求 fetch http example com api node mode no cors method GET headers Accept app
  • 如何使用 Corda Vault Extension 创建自定义架构

    从 Corda 文档来看 我们可以在 Vault Extension 中拥有自定义架构 然而 Vault Extension 并没有太多明确性 它应该能够创建 管理与节点Vault数据库相关的自定义数据库模式 我们是否会在 Corda 的功
  • App Engine Flex 的默认 VPC 防火墙规则是什么

    我在一个 App Engine 灵活环境项目中部署了一些服务 服务实例在同一个 VPC 网络 非默认 中运行 该网络在其指定的 VPC 网络中指定 app yaml文件和分配的 IP 地址来自同一子网 默认情况下 这两个服务都可以从外部访问
  • aspx页面重定向到新页面

    将浏览器重定向到包含 ASPX 页面的新页面所需的代码是什么 我在我的页面 default aspx 上尝试过此操作 or 这些导致了未确定的服务器错误 我看不到错误代码 因为服务器不在我的控制范围内 错误也不公开 请提供从页面第一行到末尾
  • 从 UICollectionViewCell 传播自定义事件

    我有一个自定义的 UICollectionViewCell 里面有一个按钮 当我点击按钮时 会在该子类中触发一个事件 然后我想在 UICollectionView 本身上触发一个事件 我可以在视图控制器中处理该事件 伪代码 class My
  • 在 Visual Studio 中关闭 WCF 服务主机[重复]

    这个问题在这里已经有答案了 可能的重复 如何防止 Visual Studio 在调试中启动 Wcf SvcHost exe https stackoverflow com questions 283145 how to prevent vi
  • 按下/松开 WPF 按钮时触发事件

    我需要在按下 WPF 按钮 通过鼠标 键盘 触摸屏等 时触发一些事件 并在未按下 WPF 按钮时触发事件 这个怎么做 这应该很容易 但我找不到如何做到这一点 您可以从 Button 派生并覆盖按下时更改 http msdn microsof
  • 将 pandas dataframe 转换为内存中类似文件的对象?

    我每天都会将大约 2 250 万条记录加载到 Postgres 数据库中 然后 我使用 pd read sql 读取这些数据 将其转换为数据帧 然后进行一些列操作和一些小的合并 我将修改后的数据保存为单独的表以供其他人使用 当我执行 pd
  • 数据库查询表示模拟 Windows 共享上的文件?

    有没有办法让某些东西看起来就像 Windows 文件共享上的文件 但实际上是通过 HTTP 提供的资源 对于上下文 我正在使用一个只能处理 Windows 文件共享上的文件的旧应用程序 我想创建一个简单的基于 HTTP 的服务来动态地提供文
  • 为什么我无法在 Angular 2 组件中加载谷歌地图?

    这是我的 ts 组件 import Component OnInit Output EventEmitter from angular core declare var google any Component selector app r