我有一个addEventListener
会多次触发取决于点击次数,如何确保它只运行一次?我尝试使用removeEventListener
但它根本没有运行。
感谢任何帮助和建议。在此先感谢:)
Provider.ts
addInfoWindow(marker,ListingID){
this.http.get(this.baseURI + '/infoWindow.php?id=' + ListingID)
.map(res => res.json())
.subscribe(Idata => {
let infoData = Idata;
let content = "<ion-item>" +
"<h2 style='color:red;'>" + infoData['0'].ListingTitle + "</h2>" +
"<p>" + infoData['0'].ListingDatePosted + ' ' + infoData['0'].ListingStartTime + "</p>" +
"<p> Salary: $" + infoData['0'].ListingSalary + "</p>" +
'<p id="' + infoData['0'].ListingID + '">Apply</p>'
"</ion-item>";
console.log("CREATING INFOWINDOW WITH CONTENT");
let infoWindow = new google.maps.InfoWindow({
content: content
});
google.maps.event.addListener(infoWindow, 'domready', () => {
let goInfoPage = document.getElementById(infoData['0'].ListingID);
console.log("GETTING PAGE ID");
//let it run only once, currently will increment by 1 if infoWindow if closed and reopen
goInfoPage.addEventListener('click', () => {
let pushData = infoData['0'];
console.log("GETTING PAGE DATA");
let nav = this.app.getActiveNav();
console.log("PUSHHING TO PAGE");
nav.push('StoreInfoPage',{'record':pushData});
})
goInfoPage.removeEventListener('click', () => {
console.log("REMOVE EVENT LISTENER"); // did not run
});
});
google.maps.event.addListener(marker, 'click', () => {
console.log("MARKER CLICKED, OPENING INFOWINDOW");
infoWindow.open(this.map, marker);
});
});
}
答案 0 :(得分:2)
removeEventListener
接受以前作为addEventListener
的侦听器添加的函数,而不是回调函数。因此,使用匿名函数作为侦听器是不切实际的 - 它们无法删除。
这是常见的JavaScript知识,并不是Angular特有的:
const onClick = () => {
...
goInfoPage.removeEventListener('click', onClick);
});
goInfoPage.addEventListener('click', onClick);
Angular应用程序通常依赖于RxJS,它可以是:
import 'rxjs/add/observable/fromEvent';
import 'rxjs/add/operator/first';
...
Observable.fromEvent(goInfoPage, 'click').first().subscribe(() => {
...
});
侦听器删除由RxJS处理。
答案 1 :(得分:0)
您必须将功能传递给removeEventListener
,如下所示:
let div = document.getElementById("myDiv");
let coolFunction = () => {
console.log("Hello World");
div.removeEventListener("click", coolFunction);
}
div.addEventListener("click", coolFunction);