В названии говорится все. Когда я использую жир-стрелку в CoffeeScript, сначала перед вызовом функции он сохраняет this
. Например:Как я могу ссылаться на фактический «этот» внутри обратного вызова жира в CoffeeScript?
class myClass
constructor: ->
element = $ "#id"
element.click ->
@myMethod(@value)
return
return
myMethod: (c)->
window.console.log(c)
return
даст
var myClass;
myClass = (function() {
function myClass() {
var element;
element = $("#id");
element.click(function() {
this.myMethod(this.value);
});
return;
}
myClass.prototype.myMethod = function(c) {
window.console.log(c);
};
return myClass;
})();
Сейчас на линии № 8 JavaScript, this.myMethod
неправильно. В этой области относится к element
вместо класса MyClass
.
Однако, если на линии № 4 CoffeeScript, я заменяю element.click ->
на element.click =>
линия # 8 в JavaScript будет _this.myMethod(_this.val)
где this
со ссылкой на MyClass хранится в _this
перед вызовом функции. Но _this.value
не определен, и даже если бы он был определен, объект, к которому я пытаюсь получить доступ, - element
(о котором в данном случае относится ключевое слово this
).
Как бы получить доступ к актуальным this
?
Еще пара вариантов: (1) Старая 'что = @' трюк все еще работает в CoffeeScript, (2) обработчик щелчка по-прежнему получить событие передается в качестве аргумента даже если он содержит стрелки с жиром, вы должны извлечь извлеченный элемент из этого события. –
@muistooshort Вы правы. Я думал о добавлении третьего примера с 'this = @', но это то же самое, что использовать стрелку жира. Ну почти то же самое, зависит от контекста. Я не использовал jQuery в течение некоторого времени, так что не думал о вашем другом предложении. Конечно, вы можете получить доступ к теме клика из события, переданного в качестве аргумента jQuery API. – topr
Основное различие между 'that = @' и '=>' заключается в том, что 'that = @' дает вам доступ к '' '' '(это немного из-за твистера языка :). Я не критикую, просто подумайте, что больше вариантов лучше (это моя upvote там). –