Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ionic framework 传单-如何将点击事件添加到ionic应用程序中标记弹出窗口内的按钮?_Ionic Framework_Leaflet_Ionic4 - Fatal编程技术网

Ionic framework 传单-如何将点击事件添加到ionic应用程序中标记弹出窗口内的按钮?

Ionic framework 传单-如何将点击事件添加到ionic应用程序中标记弹出窗口内的按钮?,ionic-framework,leaflet,ionic4,Ionic Framework,Leaflet,Ionic4,我正在尝试在我的ionic应用程序的弹出窗口中向按钮添加单击侦听器 在这里,我正在创建地图和显示标记,单击标题标记时要调用的方法也如下所示: makeCapitalMarkers(map: L.map): void { let eventHandlerAssigned = false; this.http.get(this.capitals).subscribe((res: any) => { for (const c of res.features) {

我正在尝试在我的ionic应用程序的弹出窗口中向按钮添加单击侦听器

在这里,我正在创建地图和显示标记,单击标题标记时要调用的方法也如下所示:

 makeCapitalMarkers(map: L.map): void {
    let eventHandlerAssigned = false;

    this.http.get(this.capitals).subscribe((res: any) => {
      for (const c of res.features) {
        const lat = c.geometry.coordinates[0];
        const lon = c.geometry.coordinates[1];
        let marker = L.marker([lon, lat]).bindPopup(`
        <h4 class="link">Click me!</h4>
        `);
        marker.addTo(map);
      }
    });

    map.on('popupopen', function () {
      console.log('Popup Open')
      if (!eventHandlerAssigned && document.querySelector('.link')) {
        console.log('Inside if')        
        const link = document.querySelector('.link')
        link.addEventListener('click', this.buttonClicked())
        eventHandlerAssigned = true
      }
    })
  }

 buttonClicked(event) {
    console.log('EXECUTED');
  }
makeCapitalMarkers(map:L.map):无效{
设eventHandlerAssigned=false;
this.http.get(this.capitals).subscribe((res:any)=>{
用于(分辨率特性常数c){
常数lat=c.几何坐标[0];
常数lon=c.几何坐标[1];
设标记=L.标记([lon,lat]).bindPopup(`
点击我!
`);
marker.addTo(map);
}
});
map.on('popupopen',函数(){
console.log('弹出窗口打开')
如果(!eventHandlerAssigned&&document.querySelector('.link')){
console.log('insideif')
const link=document.querySelector(“.link”)
link.addEventListener('click',this.buttonClicked())
eventHandlerAssigned=true
}
})
}
按钮点击(事件){
console.log('EXECUTED');
}
单击此标题时,在控制台中打印if时弹出Open&Inside,因此我知道我进入了if语句,但由于某种原因,buttonClicked()函数没有执行

有人能告诉我为什么这是当前的行为吗?

是的,你不能仅仅通过添加静态HTML来进行(单击)事件绑定。实现所需功能的一种方法是在添加此新dom元素后添加侦听器,请参见下面的伪代码:

makeCapitalMarkers(map: L.map): void {
    marker.bindPopup(this.popUpService.makeCapitalPopup(c));
    marker.addTo(map);
    addListener();
}

makeCapitalPopup(data: any): string {
    return `` +
        `<div>Name: John</div>` +
        `<div>Address: 5 ....</div>` +
        `<br/><button id="myButton" type="button" class="btn btn-primary" >Click me!</button>`
}

addListener() {
    document.getElementById('myButton').addEventListener('click', onClickMethod
}
makeCapitalMarkers(map:L.map):无效{
marker.bindPopup(this.popUpService.makecapitalopup(c));
marker.addTo(map);
addListener();
}
makeCapitalPopup(数据:任意):字符串{
返回`+
`姓名:约翰+
`地址:5+
`
点击我` } addListener(){ document.getElementById('myButton')。addEventListener('click',OnClick方法 }
理想情况下,对于Angular,我们不应该直接使用DOM,所以如果上述方法有效,您可以通过渲染器重构添加事件侦听器

另外,我不熟悉传单库-但是对于上述方法,您需要考虑任何异步方法(如果有的话),这样您只有在成功将此类DOM元素添加到DOM中后才调用getElementById。

所以您不能这样做(单击)只需添加静态HTML即可进行事件绑定。实现所需的一种方法是在添加此新dom元素后添加侦听器,请参见下面的伪代码:

makeCapitalMarkers(map: L.map): void {
    marker.bindPopup(this.popUpService.makeCapitalPopup(c));
    marker.addTo(map);
    addListener();
}

makeCapitalPopup(data: any): string {
    return `` +
        `<div>Name: John</div>` +
        `<div>Address: 5 ....</div>` +
        `<br/><button id="myButton" type="button" class="btn btn-primary" >Click me!</button>`
}

addListener() {
    document.getElementById('myButton').addEventListener('click', onClickMethod
}
makeCapitalMarkers(map:L.map):无效{
marker.bindPopup(this.popUpService.makecapitalopup(c));
marker.addTo(map);
addListener();
}
makeCapitalPopup(数据:任意):字符串{
返回`+
`姓名:约翰+
`地址:5+
`
点击我` } addListener(){ document.getElementById('myButton')。addEventListener('click',OnClick方法 }
理想情况下,对于Angular,我们不应该直接使用DOM,所以如果上述方法有效,您可以通过渲染器重构添加事件侦听器


另外,我不熟悉传单库-但是对于上述方法,您需要考虑任何异步方法(如果有的话),因此,只有在成功将此类DOM元素添加到DOM中后,您才调用getElementById。

我在2小时前遇到了这个问题。我不熟悉ionic,但希望这会有所帮助

创建一个变量,用于跟踪弹出窗口的内容是否已经附加了事件处理程序。然后,您可以向映射添加事件侦听器,以侦听要使用
map.on('popupopen',function(){}打开的弹出窗口
。当这种情况发生时,弹出窗口中的DOM内容被呈现,并可用
querySelector
getElementById
抓取。因此,您可以将其作为目标,并向其添加事件侦听器。您还必须为
map.on('popupclose',()=>{})创建一个事件
,并在其中,从已附加事件侦听器的dom节点中删除该事件侦听器

您需要为创建的每个独特弹出窗口执行此操作,您要将事件侦听器添加到其中的内容。但是,也许您可以构建一个函数来为您执行此操作。以下是一个示例:

const someMarker=L.marker(map.getCenter()).bindPopup(`
去挪威!
`)
someMarker.addTo(映射)
函数flyToNorway(){
飞行地图([
47.57652571374621,
-27.333984375
],3,{动画:真,持续时间:5})
someMarker.closePopup()
}
让eventHandlerAssigned=false
on('popupopen',function()){
如果(!eventHandlerAssigned&&document.querySelector('.norwayLink')){
const link=document.querySelector(“.norwayLink”)
link.addEventListener('click',flyToNorway)
eventHandlerAssigned=true
}
})
on('popupclose',function(){
document.querySelector('.norwayLink')。removeEventListener('click',flyToNorway)
eventHandlerAssigned=false
})

这就是我如何定位弹出内容并在中添加链接的方式。

我2小时前刚刚遇到这个问题。我不熟悉ionic,但希望这会有所帮助

创建一个变量,用于跟踪弹出窗口的内容是否已经附加了事件处理程序。然后,您可以向映射添加事件侦听器,以侦听要使用
map.on('popupopen',function(){}打开的弹出窗口
。当这种情况发生时,弹出窗口中的DOM内容被呈现,并可用
querySelector
getElementById
抓取。因此,您可以将其作为目标,并向其添加事件侦听器。您还必须为
map.on('popupclose',()=>{})创建一个事件
,并在其中,从已附加事件侦听器的dom节点中删除该事件侦听器

您需要为您创建的每个唯一弹出窗口执行此操作,您要将事件侦听器添加到其中的内容