Свойства класса CoffeeScript во вложенных анонимных функциях

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

Я пытаюсь создать базовый класс для управления разделом на моем сайте. Проблема, с которой я сталкиваюсь, заключается в потере определенных переменных класса в другой области. Например, приведенный ниже код отлично работает и прекрасно создает свойства внутри объекта. Однако, когда я перехожу к обратному вызову 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

person Aric    schedule 01.04.2012    source источник


Ответы (1)


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

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

поэтому @ (AKA this) не является вашим экземпляром сеанса, когда вызываются обратные вызовы. Способ, похожий на 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
person mu is too short    schedule 01.04.2012
comment
Превосходно. Спасибо за развернутый ответ. Толстая стрела - это то, что я искал. - person Aric; 02.04.2012