Свойства класса CoffeeScript внутри вложенных анонимных функций - PullRequest
4 голосов
/ 01 апреля 2012

Я знаком с методологией скрытого паттерна, но я все еще оборачиваюсь вокруг прототипов объектов.

Я пытаюсь создать базовый класс для управления разделом на моем сайте. Проблема, с которой я сталкиваюсь, заключается в потере определенных переменных класса в другой области видимости. Например, приведенный ниже код работает отлично и прекрасно создает свойства внутри объекта. Однако при переходе к обратному вызову jQuery я теряю все знания о переменных класса, хранящих некоторые объекты jQuery для многократного использования.

Есть ли способ получить их из функции обратного вызова?

class Session
    initBinds: ->
        @loginForm.bind 'ajax:success', (data, status, xhr) ->
            console.log("processed")
            return
        @loginForm.bind 'ajax:before', (xhr, settings) ->
            console.log @loader // need access to Session.loader
            return
        return
    init: ->
        @loginForm = $("form#login-form")
        @loader = $("img#login-loader")
        this.initBinds()
        return

1 Ответ

5 голосов
/ 01 апреля 2012

Обратные вызовы jQuery AJAX выполняются в контексте :

... объекта, представляющего настройки ajax, используемые в вызове ($.ajaxSettings объединены с настройкамипередается $.ajax)

, поэтому @ (AKA this) не является вашим экземпляром Session, когда вызываются обратные вызовы.Суть CoffeeScript в этом заключается в том, чтобы привязать обратный вызов к вашему экземпляру Session, используя толстую стрелку :

Толстую стрелку => можно использовать для определенияи привязать его к текущему значению this, прямо на месте.Это полезно при использовании библиотек на основе обратного вызова, таких как Prototype или jQuery, ...

Я думаю, вы хотите сказать следующее:

@loginForm.bind 'ajax:before', (xhr, settings) =>
    console.log @loader // --------------------^^
    return

И вам не нужныreturn вообще, если последнее утверждение в вашем обратном вызове не может случайно принять значение false, если вы не хотите отменять вызов AJAX;если вы хотите быть параноиком (разумная позиция, поскольку они действительно хотят нас поймать), то простого true в конце будет достаточно, чтобы получить значение не false, возвращаемое из обратного вызова:

@loginForm.bind 'ajax:before', (xhr, settings) =>
    console.log @loader // --------------------^^
    true
...