Javascript TypeError:无法读取属性';自动完成';角2中未定义的
我想用一个角度2谷歌地图自动完成,我发现 当我尝试使用它时,它给了我以下错误: 错误。ts:42错误:未捕获(承诺中):TypeError:无法读取未定义的属性“Autocomplete” 我不知道我是否错过了什么。无论如何,这是指令的代码:Javascript TypeError:无法读取属性';自动完成';角2中未定义的,javascript,angular,google-maps,Javascript,Angular,Google Maps,我想用一个角度2谷歌地图自动完成,我发现 当我尝试使用它时,它给了我以下错误: 错误。ts:42错误:未捕获(承诺中):TypeError:无法读取未定义的属性“Autocomplete” 我不知道我是否错过了什么。无论如何,这是指令的代码: import {Directive, ElementRef, EventEmitter, Output} from '@angular/core'; import {NgModel} from '@angular/forms'; declare var
import {Directive, ElementRef, EventEmitter, Output} from '@angular/core';
import {NgModel} from '@angular/forms';
declare var google:any;
@Directive({
selector: '[Googleplace]',
providers: [NgModel],
host: {
'(input)' : 'onInputChange()'
}
})
export class GoogleplaceDirective {
@Output() setAddress: EventEmitter<any> = new EventEmitter();
modelValue:any;
autocomplete:any;
private _el:HTMLElement;
constructor(el: ElementRef,private model:NgModel) {
this._el = el.nativeElement;
this.modelValue = this.model;
var input = this._el;
this.autocomplete = new google.maps.places.Autocomplete(input, {});
google.maps.event.addListener(this.autocomplete, 'place_changed', ()=> {
var place = this.autocomplete.getPlace();
this.invokeEvent(place);
});
}
invokeEvent(place:Object) {
this.setAddress.emit(place);
}
onInputChange() {
console.log(this.model);
}
}
import{Directive,ElementRef,EventEmitter,Output}来自“@angular/core”;
从'@angular/forms'导入{NgModel};
声明:任何;
@指示({
选择器:“[Googleplace]”,
提供者:[NgModel],
主持人:{
'(输入)''onInputChange()'
}
})
导出类GoogleplaceDirective{
@Output()setAddress:EventEmitter=neweventEmitter();
模型值:任意;
自动完成:任何;
私有:HTMLElement;
构造函数(el:ElementRef,私有模型:NgModel){
这一点。_el=el.nativeElement;
this.modelValue=this.model;
var输入=此值;
this.autocomplete=new google.maps.places.autocomplete(输入,{});
google.maps.event.addListener(this.autocomplete,'place\u changed',()=>{
var place=this.autocomplete.getPlace();
本.调用事件(地点);
});
}
invokeEvent(位置:Object){
this.setAddress.emit(place);
}
onInputChange(){
log(this.model);
}
}
以下是如何使用它:
<input type="text" class="form-control" placeholder="Location" name="Location" [(ngModel)]="address" #LocationCtrl="ngModel"
Googleplace (setAddress)="getAddressOnChange($event,LocationCtrl)">
如果您使用的是谷歌地图,您必须像下面这样在ngmodule中导入Api:
@NgModule({
declarations: [...],
imports: [...,
AgmCoreModule.forRoot({
clientId: '<mandatory>',
//apiVersion: 'xxx', // optional
//channel: 'yyy', // optional
//apiKey: 'zzz', // optional
language: 'en',
libraries: ['geometry', 'places']
})
],
providers: [...],
bootstrap: [...]
})
import {MapsAPILoader} from "@agm/core";
...
constructor(private mapsAPILoader: MapsAPILoader,
...
this.mapsAPILoader.load().then(() => {
let autocomplete = new window['google'].maps.places.Autocomplete(..., ...);
autocomplete.addListener("place_changed", () => { ...
https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY&libraries=places">
</script>
您可以在此处查看:如果您使用的是谷歌地图,则必须在NGM模块中导入Api,如下所示:
@NgModule({
declarations: [...],
imports: [...,
AgmCoreModule.forRoot({
clientId: '<mandatory>',
//apiVersion: 'xxx', // optional
//channel: 'yyy', // optional
//apiKey: 'zzz', // optional
language: 'en',
libraries: ['geometry', 'places']
})
],
providers: [...],
bootstrap: [...]
})
import {MapsAPILoader} from "@agm/core";
...
constructor(private mapsAPILoader: MapsAPILoader,
...
this.mapsAPILoader.load().then(() => {
let autocomplete = new window['google'].maps.places.Autocomplete(..., ...);
autocomplete.addListener("place_changed", () => { ...
https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY&libraries=places">
</script>
您可以在此处查看:此方法帮助我消除了此错误。只需将google maps api导入更改为如下所示:
@NgModule({
declarations: [...],
imports: [...,
AgmCoreModule.forRoot({
clientId: '<mandatory>',
//apiVersion: 'xxx', // optional
//channel: 'yyy', // optional
//apiKey: 'zzz', // optional
language: 'en',
libraries: ['geometry', 'places']
})
],
providers: [...],
bootstrap: [...]
})
import {MapsAPILoader} from "@agm/core";
...
constructor(private mapsAPILoader: MapsAPILoader,
...
this.mapsAPILoader.load().then(() => {
let autocomplete = new window['google'].maps.places.Autocomplete(..., ...);
autocomplete.addListener("place_changed", () => { ...
https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY&libraries=places">
</script>
然后将&libraries=places
添加到URL的末尾,使其如下所示:
@NgModule({
declarations: [...],
imports: [...,
AgmCoreModule.forRoot({
clientId: '<mandatory>',
//apiVersion: 'xxx', // optional
//channel: 'yyy', // optional
//apiKey: 'zzz', // optional
language: 'en',
libraries: ['geometry', 'places']
})
],
providers: [...],
bootstrap: [...]
})
import {MapsAPILoader} from "@agm/core";
...
constructor(private mapsAPILoader: MapsAPILoader,
...
this.mapsAPILoader.load().then(() => {
let autocomplete = new window['google'].maps.places.Autocomplete(..., ...);
autocomplete.addListener("place_changed", () => { ...
https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY&libraries=places">
</script>
这种方法帮助我摆脱了这个错误。只需将google maps api导入更改为如下所示:
@NgModule({
declarations: [...],
imports: [...,
AgmCoreModule.forRoot({
clientId: '<mandatory>',
//apiVersion: 'xxx', // optional
//channel: 'yyy', // optional
//apiKey: 'zzz', // optional
language: 'en',
libraries: ['geometry', 'places']
})
],
providers: [...],
bootstrap: [...]
})
import {MapsAPILoader} from "@agm/core";
...
constructor(private mapsAPILoader: MapsAPILoader,
...
this.mapsAPILoader.load().then(() => {
let autocomplete = new window['google'].maps.places.Autocomplete(..., ...);
autocomplete.addListener("place_changed", () => { ...
https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY&libraries=places">
</script>
然后将&libraries=places
添加到URL的末尾,使其如下所示:
@NgModule({
declarations: [...],
imports: [...,
AgmCoreModule.forRoot({
clientId: '<mandatory>',
//apiVersion: 'xxx', // optional
//channel: 'yyy', // optional
//apiKey: 'zzz', // optional
language: 'en',
libraries: ['geometry', 'places']
})
],
providers: [...],
bootstrap: [...]
})
import {MapsAPILoader} from "@agm/core";
...
constructor(private mapsAPILoader: MapsAPILoader,
...
this.mapsAPILoader.load().then(() => {
let autocomplete = new window['google'].maps.places.Autocomplete(..., ...);
autocomplete.addListener("place_changed", () => { ...
https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY&libraries=places">
</script>
你确定定义了google.maps.places
吗?谢谢你的回答,但我只是复制了代码,因为我必须安装依赖项??你应该尝试console.log(google.maps)
并查看它在这一行前面是否有places
属性:this.autocomplete=new google.maps.places.autocomplete(输入,{})
它给了我以下信息:{“动画”:{“反弹”:1,“下降”:2,“Zo”:3,“Uo”:4},“控制位置”:{“上左”:1,“上中”:2,“上中”:2,“上右”:3,“左中”:4,“左上”:5,“左下”:6,“右上”:7,“右”:7………(对象太长了)你确定定义了google.maps.places
吗?谢谢你的回答,但我只是复制了代码,因为它必须安装依赖项??你应该尝试console.log(google.maps)
并查看它在这一行前面是否有places
属性:this.autocomplete=new google.maps.places.autocomplete(输入,{})它给了我这个:{“动画”:{“反弹”:1,“下降”:2,“Zo”:3,“Uo”:4},“控制位置”:{“左上”:1,“右上”:2,“右上”:3,“左中”:4,“左上”:5,“左下”:6,“右上”:7,“右上”:7………(这个物体太长了)