单击InfoWindow Typescript Angular2

时间:2017-04-10 11:11:15

标签: javascript google-maps angular typescript ionic2

嗨,我已经搜了好几个小时,希望你能帮助我:)

如果您点击Google地图上的InfoWindow,我想显示一个页面。 (使用Ionic 2的ModalController)

问题

点击“无效”..

var infoWindow = new google.maps.InfoWindow({
      content: '<h2 (click)="goToProductPage(product)">Click me</h2>'
    });


goToProductPage(product :any){
    let modal = this.modalCtrl.create(ProductPage, product);

    modal.present();
}

可悲的是,这不起作用,我还尝试使用带有onclick=""的内容节点和javascript函数。

这是另一个未解决的question with the same problem

祝你好运, 路易斯

修改

setProductMarker(product :any, productLocation :any){

    var contentWindow = "<h2 id='clickableItem'>Click me</h2>" + product.productName + "<img src='" + product.imgUrl + "' width='60' height='60' /> <br/>" + product.date

    var clickableItem = document.getElementById('clickableItem');

    clickableItem.addEventListener('click' , () => {
       this.goToProductPage(product);
     });

    var productMarker = new google.maps.Marker({
      position: new google.maps.LatLng(JSON.parse(productLocation).latitude, JSON.parse(productLocation).longitude),
      map: this.map,
      title:"Product"
    })


    var infoWindow = new google.maps.InfoWindow({
      content: contentWindow
    });

    infoWindow.addListener('click', () => {
      alert("yeah");
      console.log("yeah");
    });


  productMarker.addListener('click', event => {
    infoWindow.open(this.map, productMarker);
    this.productNow = product;
    });

  }

2 个答案:

答案 0 :(得分:8)

解决方案

感谢Daniel Cooke

的帮助
var clickableItem = document.getElementById('clickableItem');
   clickableItem.addEventListener('click' , () => this.goToProductPage())

- &GT;问题是我的InfoWindow内容还没有为DOM操作做好准备。

所以,由于这个question,我添加了一个domready听众。

google.maps.event.addListener(infoWindow, 'domready', function() {
   // your code
});

以下是完整的源代码:

setProductMarker(product :any, productLocation :any){
    var contentWindow = product.productName + "<h2 id='clickableItem'>Click me</h2><img src='" + product.imgUrl + "' width='60' height='60' /> <br/>" + product.date;


    var productMarker = new google.maps.Marker({
      position: new google.maps.LatLng(JSON.parse(productLocation).latitude, JSON.parse(productLocation).longitude),
      map: this.map,
      title:"Product"
    })


    var infoWindow = new google.maps.InfoWindow({
      content: contentWindow
    });

    google.maps.event.addListener(infoWindow, 'domready', () => {
      //now my elements are ready for dom manipulation
      var clickableItem = document.getElementById('clickableItem');
      clickableItem.addEventListener('click', () => {
        this.goToProductPage(product);
      });
    });

  productMarker.addListener('click', event => {
    infoWindow.open(this.map, productMarker);
    this.productNow = product;
    });

  }

再次感谢丹尼尔的耐心等待! :)

答案 1 :(得分:4)

如果InfoWindow是相同的InfoWindow from the official API,那么它无法工作的原因是因为它不知道如何管理Angular2绑定。它只是简单的旧Javascript。

您需要以旧式方式添加事件侦听器。

clickableItem.addEventListener('click' , () => {/*callbackCode */})

修改

请注意,您必须访问Google maps api公开的一些DOM事件才能执行此操作。

在angular2组件中

var content = "<h3 id="click">Clickable Element</b>";


var info = new google.maps.InfoWindow({
    content: content
});

google.maps.event.addListener(info, 'domready', function() {
    document.getElementById("click").addEvent("click", function(e) {
        console.log("hello world");
        e.stop();

    });
});

注意:我从official API的事件部分中提取了大部分内容 - 您应该检查一下。