Coffeescript — ‘this’ всегда заменяется на ‘_this’ в обратном вызове с жирной стрелкой

#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 вели себя таким образом, что тонкие или толстые стрелки влияли только на то, как @ себя вели, а не на ключевое слово literal this , так как в @ они фиксировали бы контекст 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 есть что-то более элегантное для обработки этого..