2017-02-17 3 views
0

Новых в машинописи, пытаясь выяснить, почему это не работает:Машинопись Uncaught TypeError: это не функция при вызове функции из обработчика событий JQuery

У меня есть следующее определение класса:

class SliderRange { 

    updateSliderText(lowId: JQuery, highId: JQuery) { 
     //do some updates 
    } 

    constructor(public uiId: string, lowDisplay: JQuery, highDisplay: JQuery) { 
     //register the events that tie ui to the set methods here. 
     this.primaryUi().on("input", function() { 
      this.updateSliderText(lowDisplay, highDisplay); 
     }); 

     this.secondaryUi().on("input", function() { 
      this.updateSliderText(lowDisplay, highDisplay); 
     }); 
    } 

    private primaryUi() : JQuery { 
     return $(`.original#${this.uiId}`); 
    } 
    private secondaryUi(): JQuery { 
     return $(`.ghost#${this.uiId}`); 
    } 
} 

События запускаются правильно, но при их запуске браузер жалуется, что this.updateSliderText не является функцией. Если посмотреть в браузере, это не будет заменено на TypScript и вместо этого ссылается на объект JQuery (primaryUi или secondaryUi). Однако IntelliSense правильно переходит к правильной функции updateSliderText, что заставляет меня поверить, что она должна скомпилироваться в javascript, который правильно ссылается на эту функцию.

Как ссылаться на функцию, принадлежащую классу в обработчиках событий jquery?

спасибо.

+0

Если вы не используете это, используйте updateSliderText (lowDisplay, highDisplay), что произошло? –

+0

@TonyDong TS2304 Не удается найти имя 'updateSliderText' ошибка компиляции ts. – Kolichikov

ответ

3

Неправильный адрес this, в котором вы звоните this.updateSliderText.

Вам нужна функция стрелки (они были изобретены именно по этой причине) или сделать это старый стиль, путем связывания его:

this.primaryUi().on("input",() => { // Yay, cool arrow functions. 
    this.updateSliderText(lowDisplay, highDisplay); 
}); 

this.primaryUi().on("input", (function() { 
    this.updateSliderText(lowDisplay, highDisplay); 
}).bind(this)); // yay...? old-bind-style 

Прохладная и машинопись метод стрелка один.

+0

Прохладный, это именно то, что я ищу! У вас есть ссылка или имя, которое я могу использовать для этой функции стрелки? – Kolichikov

+1

Да, это их имя. Функции стрелки: https://basarat.gitbooks.io/typescript/content/docs/arrow-functions.html –

Смежные вопросы