Javascript TypeError:无法读取属性';自动完成';角2中未定义的

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

我想用一个角度2谷歌地图自动完成,我发现

当我尝试使用它时,它给了我以下错误:

错误。ts:42错误:未捕获(承诺中):TypeError:无法读取未定义的属性“Autocomplete”

我不知道我是否错过了什么。无论如何,这是指令的代码:

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………(这个物体太长了)