Angular - 输入值更改时不会触发 Google 位置指令

标签 angular typescript google-places-api angular2-directives

我正在尝试编写一个谷歌地点指令,因为所有完成的指令似乎都不能很好地工作,或者有一个可怕的代码库。

所以这是我的尝试,它是干净的,但当用户键入内容时它不会激活:

@Directive({
  selector: '[googlePlace]'
})

export class GoogleplaceDirective implements OnInit {
  @Output() placeChange: EventEmitter<any> = new EventEmitter<any>();

  public autocomplete: any;

  constructor(private elementRef: ElementRef) {}

  ngOnInit() {

    this.autocomplete = new google.maps.places.Autocomplete(this.elementRef.nativeElement, {});

    google.maps.event.addListener(this.autocomplete, 'place_changed', () => {

      const place = this.autocomplete.getPlace();

      this.placeChange.emit(place);
    });
  }
}

然后我像这样使用:

<input formControlName="address" googlePlace (placeChange)="setAddress($event)">

但是当我输入输入时,自动完成功能没有触发,我可能错过了一些简单的东西,但我不知道那可能是什么。也许我必须以某种方式手动监听输入,然后触发搜索?

最佳答案

当谷歌地图事件在 Angular 区域外触发时,您需要在 Angular 区域内运行回调:

constructor(private zone: NgZone) {}

google.maps.event.addListener(this.autocomplete, 'place_changed', () => {
  const place = this.autocomplete.getPlace();
  this.zone.run(() => this.placeChange.emit(place)); // run inside angular zone
});

另请参阅

关于Angular - 输入值更改时不会触发 Google 位置指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43910707/

相关文章:

angular - 如何在一个 json 响应中设置一个 Material Angular 表,并将键和值分隔到不同的数组中?

Angular2 authguards 执行异步函数失败

typescript - 如何在TypeScript中编写不包含空字符串的字符串类型

angular - 如何在模板上显示包含 html 内容的 typescript 字符串变量作为元素,而不是字符串?

javascript - 谷歌地图 API v3 : Why are there inconsistencies between my search results by Google Maps API V3 and Google Maps?

android - 如何使用 Android 版 Google Places API 获取 opening_hours

ios - 迁移到 Places 4.0 SDK,如何迁移 place Bias?

visual-studio - 带有 Angular2 和 VS 2015 的 Webpack

angular - 如何使用angular 2中的ng2文件上传提交帖子数据?

angular - 如何使用 typescript 创建枚举并返回字符串