Autor Zpráva
ondrakrajcik
Profil *
Dobrý den,

narazil jsem v typeScriptu na problém

mám nějakou třídu:

class A{

...

private init() { this.refresh(); }

private refresh() {....}

...

}

V kodu mám nějaký button po kterém se vyvolá událost click a zavolá se init na objekt třídy A. Když se vykonává init tak chce zavolat metodu refresh,ale do console mně vyskočí chyba "Uncaught TypeError undefined is not function ... "

Nevíte někdo co může být špatně? :-(
Jan Tvrdík
Profil
Asi špatně předáváš ten callback na metodu init. Místo this.init předej this.init.bind(this).
Viz také developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
Karel N.
Profil
Co tohle je za šílenost? :)

Vypadá to, že to špatně používáš. Musíš si vytvořit instanci třídy A a poté na ní můžeš volat metody a používat contenxt (this). Ty se snažíš volat staticky metodu init a divíš se, že neexistuje context (undefined is not function, protože this obsahuje globální scope, která nemá žádnou funkci refresh).

Třídu bys měl používat nějak takto:
Class A {
    constructor(public event: Event) { //při použití tříd má construktor výzman přibližně tvého init
    }

    public refresh() {
        //...
    }
}

object.onclick=function(event){ new A(event) };

PS: private je klíčové slovo, která znamená, že se metoda (funkce) nevolá z venku, tj. mimo samotnou třídu. V typescriptu můžeš na takovouhle metodu přistoupit, protože jí také vloží do prototype vygenerované třídy. Používej klíčové slovo public, pokud se jedná o veřejnou metodu.

PPS: každopádně tohle není dobrý use case, třídy bys měl používat trochu jinak. Když sem poskytneš zbytek kódu, jak vypadá navěšení na click a co vše třída dělá, poradím ti, jak kód strukturovat.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: