2014-02-04 1 views
1

В названии говорится все. Когда я использую жир-стрелку в 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?

ответ

2

Вы можете достичь своей цели, по крайней мере, тремя способами. Первый один будет:

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 

третий один как показано ниже. Я не уверен в использовании API jQuery, хотя лучше проверить на appropriate docs page.

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

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

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

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

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

    myMethod: (c) -> window.console.log(c) 
+1

Еще пара вариантов: (1) Старая 'что = @' трюк все еще работает в CoffeeScript, (2) обработчик щелчка по-прежнему получить событие передается в качестве аргумента даже если он содержит стрелки с жиром, вы должны извлечь извлеченный элемент из этого события. –

+0

@muistooshort Вы правы. Я думал о добавлении третьего примера с 'this = @', но это то же самое, что использовать стрелку жира. Ну почти то же самое, зависит от контекста. Я не использовал jQuery в течение некоторого времени, так что не думал о вашем другом предложении. Конечно, вы можете получить доступ к теме клика из события, переданного в качестве аргумента jQuery API. – topr

+1

Основное различие между 'that = @' и '=>' заключается в том, что 'that = @' дает вам доступ к '' '' '(это немного из-за твистера языка :). Я не критикую, просто подумайте, что больше вариантов лучше (это моя upvote там). –