I have the following code:
class Currency { private counter = document.getElementById('counter'); private dust = 0; private books = 0; private bookCounter = document.getElementById("books"); constructor() { console.log("test") document.getElementById("bookbuy").addEventListener("click", this.buyBook) } public count() { this.dust ++; this.counter.innerHTML = "You have " + this.dust + " dust"; console.log(this.dust) } public buyBook() { if (this.dust >= 10) { console.log("if works"); this.dust - 10; this.books ++; this.counter.innerHTML = "You have " + this.dust + " dust"; this.bookCounter.innerHTML = "You have " + this.books + " books"; } else { console.log(this.dust) } } } window.addEventListener("load", init); function init(): void { const currency = new Currency(); setInterval(() => {currency.count();}, 1000); }
the console.log in count() is defined and working fine, but when i try to use this.dust in buyBook() it returns as undefined. Why is this and how do I fix it?
Advertisement
Answer
You want to bind the this context for buyBook, or the event handler will redefine the this context.
Edit: Also, I think you meant to decrement 10 from this.dust
not just subtract 10
class Currency { private counter = document.getElementById('counter'); private dust = 0; private books = 0; private bookCounter = document.getElementById("books"); constructor() { console.log("test") document.getElementById("bookbuy").addEventListener("click", this.buyBook.bind(this)) } public count() { this.dust ++; this.counter.innerHTML = "You have " + this.dust + " dust"; console.log(this.dust) } public buyBook() { if (this.dust >= 10) { console.log("if works"); this.dust -= 10; this.books ++; this.counter.innerHTML = "You have " + this.dust + " dust"; this.bookCounter.innerHTML = "You have " + this.books + " books"; } else { console.log(this.dust) } } } window.addEventListener("load", init); function init(): void { const currency = new Currency(); setInterval(() => {currency.count();}, 1000); }