Ste*_*veB 2 javascript google-maps-api-3 ionic4
我正在努力让Google地图在香草Ionic 4标签下工作.这是我得到的错误.
Error: Element must be under <body>
at Function.push../node_modules/@ionic-native/google-maps/ngx/index.js.GoogleMaps.create (index.js:208)
at Tab1Page.push../src/app/tab1/tab1.page.ts.Tab1Page.initMap (tab1.page.ts:24)
Run Code Online (Sandbox Code Playgroud)
这是选项卡HTML.
<ion-header>
<ion-toolbar>
<ion-title>
Find A Store
</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<div #map id="map_canvas" style="height:100%;"></div>
</ion-content>
Run Code Online (Sandbox Code Playgroud)
这是标签打字稿.
import { Component, ViewChild, OnInit } from '@angular/core';
import { Platform, NavController } from "@ionic/angular";
import { GoogleMaps, GoogleMap, GoogleMapsEvent, LatLng, MarkerOptions, Marker } from "@ionic-native/google-maps/ngx";
@Component({
selector: 'app-tab1',
templateUrl: 'tab1.page.html',
styleUrls: ['tab1.page.scss']
})
export class Tab1Page implements OnInit {
@ViewChild('map') element;
constructor(public googleMaps: GoogleMaps, public platform: Platform,
public nav: NavController) {}
async ngOnInit() {
await this.platform.ready();
await this.initMap()
}
initMap() {
let map: GoogleMap = GoogleMaps.create(this.element.nativeElement);
map.one(GoogleMapsEvent.MAP_READY).then((data: any) => {
let coordinates: LatLng = new LatLng(36.06731743465648, -79.79521393775941);
let position = {
target: coordinates,
zoom: 17
};
map.animateCamera(position);
let markerOptions: MarkerOptions = {
position: coordinates,
icon: "../../assets/images/icons8-Marker-64.png",
title: 'Greensboro, NC'
};
const marker = map.addMarker(markerOptions)
.then((marker: Marker) => {
marker.showInfoWindow();
});
})
}
}
Run Code Online (Sandbox Code Playgroud)
由于HTML片段应该已经在body标签下,我不确定这是怎么发生的,除非片段在生成主体之前呈现.在地图创建功能的此代码段中,Google地图模块中会抛出异常.
if (element instanceof HTMLElement) {
if (!element.offsetParent) {
throw new Error('Element must be under <body>');
}
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.
要将原生Google地图视图嵌入到您的应用中,有两种解决方案:
1-使用元素DIV ID:
import { Component, ViewChild, OnInit, ElementRef } from '@angular/core';
import { Platform, NavController } from "@ionic/angular";
import { GoogleMaps, GoogleMap, GoogleMapsEvent, LatLng, MarkerOptions, Marker } from "@ionic-native/google-maps/ngx";
@Component({
selector: 'app-tab1',
templateUrl: 'tab1.page.html',
styleUrls: ['tab1.page.scss']
})
export class Tab1Page implements OnInit {
map: GoogleMap;
constructor(public googleMaps: GoogleMaps, public platform: Platform,
public nav: NavController) { }
async ngOnInit() {
await this.platform.ready();
await this.initMap();
}
initMap() {
this.map = GoogleMaps.create("map_canvas");
this.map.one(GoogleMapsEvent.MAP_READY).then((data: any) => {
let coordinates: LatLng = new LatLng(36.06731743465648, -79.79521393775941);
let position = {
target: coordinates,
zoom: 17
};
this.map.animateCamera(position);
let markerOptions: MarkerOptions = {
position: coordinates,
//icon: "../../assets/images/icons8-Marker-64.png",
title: 'Greensboro, NC'
};
const marker = this.map.addMarker(markerOptions)
.then((marker: Marker) => {
marker.showInfoWindow();
});
})
}
}
Run Code Online (Sandbox Code Playgroud)
2-使用@ViewChild:
import { Component, ViewChild, OnInit, ElementRef } from '@angular/core';
import { Platform, NavController } from "@ionic/angular";
import { GoogleMaps, GoogleMap, GoogleMapsEvent, LatLng, MarkerOptions, Marker } from "@ionic-native/google-maps/ngx";
@Component({
selector: 'app-tab1',
templateUrl: 'tab1.page.html',
styleUrls: ['tab1.page.scss']
})
export class Tab1Page {
@ViewChild('map') element: ElementRef;
map: GoogleMap;
constructor(public googleMaps: GoogleMaps, public platform: Platform,
public nav: NavController) { }
ionViewDidEnter() {
console.log("call ionViewDidLoad");
this.platform.ready().then(() => {
this.initMap();
});
}
initMap() {
this.map = GoogleMaps.create(this.element.nativeElement);
this.map.one(GoogleMapsEvent.MAP_READY).then((data: any) => {
let coordinates: LatLng = new LatLng(36.06731743465648, -79.79521393775941);
let position = {
target: coordinates,
zoom: 17
};
this.map.animateCamera(position);
let markerOptions: MarkerOptions = {
position: coordinates,
//icon: "../../assets/images/icons8-Marker-64.png",
title: 'Greensboro, NC'
};
const marker = this.map.addMarker(markerOptions)
.then((marker: Marker) => {
marker.showInfoWindow();
});
})
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您不能在ngOnInit()函数中调用this.initMap(),因为HTML DOM不能完整呈现.所以在Ionic 4中,你需要在ionViewDidEnter()中调用它.有关更多信息,请阅读Ionic 4和Angular中的Lifecycle Hooks
截图
你在这里找到我的源代码:ionic4-tabs-map