Как мне обратиться к фактическому «this» в обратном вызове жирной стрелки CoffeeScript?

Название говорит само за себя. Когда я использую жирную стрелку в CoffeeScript, она сохраняетthis сначала перед вызовом функции. Например:

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 неправильно. В этой областиthis относится кelement вместо классаMyClass.

Однако, если в строке # 4 CoffeeScript, я заменяюelement.click -> поelement.click => строка # 8 в JavaScript станет_this.myMethod(_this.val) гдеthis ссылка на myClass хранится в_this перед вызовом функции. Но_this.value не определено, и даже если бы он был определен, объект, к которому я пытаюсь получить доступ,element (который упоминается фактическимthis ключевое слово в области действия этой функции).

Как бы получить доступ к фактическимthis в настоящее время?

Ответы на вопрос(1)

Решение Вопроса

class myClass
    constructor: ->
        element = $ "#id"
        element.click =>
            @myMethod(element.value)
            return
        return

    myMethod: (c) ->
        window.console.log(c)
        return

И второе

class myClass
    constructor: ->
        element = $ "#id"
        myMethodCallback = (c) => @myMethod(c)
        element.click ->
            myMethodCallback(@value)
            return
        return

    myMethod: (c) ->
        window.console.log(c)
        return

Третий, как показано ниже. Я не уверен насчет использования jQuery API, так что лучше проверьтесоответствующая страница документации.

class myClass
    constructor: ->
        element = $ "#id"
        element.click (event) =>
            @myMethod(event.target.value)
            return
        return

    myMethod: (c) ->
        window.console.log(c)
        return

Я бы предпочел 1-й способ, так как он кажется более простым. Это или другое, но вам нужно решить, «какое это» вы хотели бы иметь в рамках обратного вызова element.click. Невозможно получить доступ к двум «этим» одновременно.

Кстати. Все эти ответные заявления кажутся ненужными. Самое короткое рабочее решение будет выглядеть так:

class myClass
    constructor: ->
        element = $ "#id"
        element.click => @myMethod(element.value)

    myMethod: (c) -> window.console.log(c)
 topr04 февр. 2014 г., 19:15
@muistooshort Вы правы. Я думал о добавлении 3-го примера сthat = @, но это то же самое, что использование жирной стрелки. Ну, почти то же самое, зависит от контекста. Я уже давно не пользуюсь jQuery, поэтому не подумал о вашем другом предложении. Конечно, вы можете получить доступ к теме клика из события, переданного в качестве аргумента jQuery API.
 Zia Ur Rehman05 февр. 2014 г., 03:39
Спасибо. Я имел в виду все эти варианты. Я спрашивал, есть ли другой символ / ключевое слово, которое хранит фактическийthis внутри обратного вызова жирной стрелы. Я знаю все эти методы. И тот, который обсуждался в комментариях, т.е.that = @ это тот, который я использую чаще всего. Кроме того, 2-й и 3-й методы в ответе выше применимы, если я использую jQuery, и я предварительно передалelementОднако я использовал это только в качестве примера. Это был довольно глупый вопрос, я думаю сейчас. Ха-ха. Все равно, спасибо за помощь.
 topr04 февр. 2014 г., 19:34
Вот почему я написал, что этопочти тот же самый. Жирная стрелка была введена, чтобы избежать необходимости использованияthat = this Трюк, который был необходим в JavaScript. Таким образом, использование этого и старого трюка в то же время, кажется, довольно хакерский. Во всяком случае, это, вероятно, все еще чище, чем определение обратного вызова метода в строке выше, я думаю (мой второй пример). Спасибо за указание на это :)
 mu is too short04 февр. 2014 г., 19:08
Еще пара вариантов: (1) старыйthat = @ Трюк все еще работает в CoffeeScript. (2) Обработчик щелчка будет по-прежнему получать событие, переданное в качестве аргумента, даже если он жирным шрифтом, вы должны иметь возможность извлечь элемент clicked из этого события.
 mu is too short04 февр. 2014 г., 19:25
Основное различие междуthat = @ а также=> в том, чтоthat = @ дает вам доступ к обоим@s (это немного скороговорка :). Я не критикую, просто подумайте, что больше вариантов лучше (это мой голос там).

Ваш ответ на вопрос