【问题标题】:Angular google map close info window on new marker click新标记单击上的 Angular 谷歌地图关闭信息窗口
【发布时间】:2018-08-06 19:17:13
【问题描述】:

我正在使用 Angular 谷歌地图:https://angular-maps.com/。 现在作为默认功能,它打开标记内定义的信息窗口。 在点击任何新标记时,它仍然打开旧窗口。我需要在单击另一个标记时关闭信息窗口。 这是html代码:

<agm-map [latitude]="lat" [longitude]="lng" [zoom]="zoom">
          <agm-marker 
              *ngFor="let m of markers; let i = index"
              (markerClick)="clickedMarker(m.label, infoWindow, i)"
              [latitude]="m.lat"
              [longitude]="m.lng"
              [markerDraggable]="m.draggable"                
              [iconUrl]="m.icon">

            <agm-info-window #infoWindow>
              <strong>{{m.name}}</strong><br>
            </agm-info-window>

          </agm-marker>
        </agm-map>

这是点击标记时的代码:

clickedMarker(label: string, infoWindow, marker, index: number) {
     if( this.infoWindowOpened ===  infoWindow)
      return;

    if(this.infoWindowOpened !== null)
    {
     this.infoWindowOpened.close();
    }
    this.infoWindowOpened = infoWindow;
}

页面刷新时有效。但是,一旦我刷新标记变量,它就会显示此错误:

ERROR TypeError: Cannot read property 'then' of undefined
at InfoWindowManager.close (info-window-manager.js:48)
at AgmInfoWindow.close (info-window.js:94)
at SearchComponent.clickedMarker (search.component.ts:188)

刷新标记的组件代码:

this.markers.push({
              name: item.Name,  
              lat: parseFloat(item.latitude.toString()),
              lng: parseFloat(item.longitude.toString()),
              draggable: false,      
              icon:'assets/img/marker.png'
            });

【问题讨论】:

    标签: angular google-maps


    【解决方案1】:

    你可以改写你的clickedMarker很简单,如下

    previous;
    ...
    clickedMarker(infowindow) {
        if (this.previous) {
          this.previous.close();
        }
        this.previous = infowindow;
      }
    

    在模板中修改你的事件绑定函数

    (markerClick)="clickedMarker(infoWindow)"
    

    实时代码是here

    【讨论】:

    • 但是错误来了,当新的标记在运行时被推入标记数组时。上面的代码在初始页面加载时工作正常。
    • 使用答案的代码,可以动态添加标记。见live version
    【解决方案2】:

    我有同样的问题 infoWindow 没有自动关闭。在我的场景中,我有两个按钮可以在地图上显示最喜欢和不喜欢的图标。我在 ngOnInint() 中调用 this.infoWindowOpened = null 在每个最喜欢和不喜欢的按钮单击上。因此它将每次单击都初始化为 null。所以它解决了我的问题..它可能对其他人有帮助..

        ngOnInit() {
          this._mapService.selectedIcon.subscribe((res) => {
            this.infoWindowOpened = null;            
          });
        }
        if (this.infoWindowOpened === infoWindow)
           return;
    
        if (this.infoWindowOpened !== null && this.infoWindowOpened !== undefined)
            this.infoWindowOpened.close();
    
        this.infoWindowOpened = infoWindow;
    

    【讨论】:

      【解决方案3】:

      您需要检查代码中的未定义:“this.infoWindowOpened !== undefined”

      public clickedMarker(label: string, infoWindow: any, marker: any, index: number) {
      
          if (this.infoWindowOpened === infoWindow) {
              console.log("window already opened");
              return;
          }
      
          if (this.infoWindowOpened !== null && this.infoWindowOpened !== undefined) {
              this.infoWindowOpened.close();
          }
          this.infoWindowOpened = infoWindow;
      }
      

      【讨论】:

      • 但是,关闭事件不起作用。我的实际问题是,一旦我点击另一个标记,信息窗口就应该关闭。
      【解决方案4】:

      我遇到了这个问题,问题是当您更新数据时,所有信息窗口都会再次呈现。所以原来的不存在了,不可能关闭。 为避免这种情况,请使用 trackBy 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 2018-03-01
        • 2012-07-02
        相关资源
        最近更新 更多