#javascript #jquery #coffeescript #this #jquery-callback
#javascript #jquery #coffeescript #это #jquery-обратный вызов
Вопрос:
Мне интересно, возможно ли каким-либо образом предотвратить преобразование this
ключевого слова в _this
внутри обратного вызова fat arrow ( =>
)?
Например:
class someClass
someMethod: ->
$(document).on 'click', '.myclass', (e) =>
# doing things with right context this, it's ok
@anotherMethod()
@oneMoreMethod()
# but here I need jQuery ``this`` pointing to element
$el = $ this # this is transformed into ``_this`` :(
Может быть, я пропустил какой-то параметр или оператор?
ОБНОВЛЕНИЕ Я знаю о подобном трюке self = this
, но я думал, что в CS есть что-то более элегантное..
Комментарии:
1. Попробуйте использовать
$(e.target)
2. в моем конкретном случае
e.target
это не решение, мне нужно использоватьthis
, чтобы получить конкретный элемент с выбранным мной атрибутом, а не его дочерние элементы.3. Странный трюк, позволяющий заставить это работать, — заменить
this
на<backtick><space>this<backtick>
, и он использует обычныйthis
, как и ожидалось. Между первым обратным тиком и этим требуется пробел. Смотрите это
$(document).on ‘click’, ‘.myclass’, (e) =>
# doing things with right context this, it’s ok
@anotherMethod()
@oneMoreMethod()
$el = $ ` this`» rel=»nofollow noreferrer»> здесь4. Никто не должен вам комментарий с понижением. Кто-то думает, что ваш вопрос «неясен или бесполезен», или ему не хватает исследований. Вероятно, потому, что ваш вопрос не имеет смысла. Вы спрашиваете, как предотвратить одиночное поведение, которое
=>
специально предназначено для вас. Если вы не хотите такого поведения, используйте->
.5. @vcsjones Такого рода уловки почти наверняка приведут к сбою в какой-то момент при обновлении компилятора CoffeeScript. Зависеть от ошибок и причуд — действительно плохая идея, вдвойне, когда есть разумные решения.
Ответ №1:
В этом вся цель =>
.
Используйте $(e.currentTarget)
, чтобы получить дескриптор элемента, который был бы this
. Это не то же самое, $(e.target)
что вы уже отклонили.
И нет, у CoffeeScript не может быть ничего более элегантного для обработки этого. У вас может быть только один контекст для функции. Связанные функции не уникальны для CoffeeScript, они являются особенностью JavaScript, и решение заключается в том, чтобы вызывающий код предоставлял другой способ доступа к элементу, который jQuery выполняет с помощью e.target
и e.currentTarget
.
Комментарии:
1. Не уверен, что я согласен с последним абзацем. Я думал , что более старые версии CoffeeScript вели себя таким образом, что тонкие или толстые стрелки влияли только на то, как
@
себя вели, а не на ключевое слово literalthis
, так как в@
они фиксировали бы контекстthis
перед функцией иthis
всегда оставались бы в покое какthis
.
Ответ №2:
Цель =>
жирной стрелки в отличие от тонкой стрелки ->
— предотвратить изменение контекста this
. Здесь у вас есть несколько вариантов. Одним из вариантов является сохранение ссылки на this
внутри переменной, например, следующей.
self = @
method: -> @ is self # true
self = @
method: => @ is self # false
class someClass
someMethod: ->
self = @
$(document).on 'click', '.myclass', (e) ->
# self (by default) refers to your class
# @ refers to the jquery object (context)
Комментарии:
1. да, я знаю этот трюк с JavaScript.. Я думал, что у Coffee есть что-то более элегантное для обработки этого..