Классы Coffeescript и область применения и толстые и тонкие стрелки - PullRequest
7 голосов
/ 04 августа 2011

В толстой функции со стрелками в классе coffeescript, как я могу получить доступ к области действия класса, а также к функции?

Пример:

class Example
  foo: ->
    $('.element').each =>  # or ->
      @bar($(this))        # I want to access 'bar' as well as the jquery element
  bar: (element) ->
    element.hide()

Итак, в этом примереесли я использую a =>, то @ относится к классу this, но «this» тогда неверно, тогда как если я использую -> для каждого, тогда «this» будет правильно определено, но тогда как мне это сделать?ссылаться на панель функций класса?

Спасибо!

Ответы [ 3 ]

16 голосов
/ 05 августа 2011

Хотя Мак прав, он не может указать, что в сценарии кофе вам редко требуется метод each jQuery, который, как вы заметили, пробивает ваш контекст выполнения без вашего разрешения.* Циклические функции кофейного скрипта поддерживают концепцию each без какого-либо реального кода библиотеки.И они также не генерируют новую область видимости или контекст, что означает, что вам не нужна жирная стрелка любого вида.

10 голосов
/ 04 августа 2011

Это потому, что в CoffeeScript @ - это псевдоним this, т. Е. При компиляции .coffee в .js @ будет заменен на this.

Если Example::bar безобразно, я не думаю, что есть более «симпатичные» решения.

Вы можете сохранить ссылку на this до вызова .each:

class Example
  foo: ->
    self = @
    $('.element').each ->
      self.bar($(this)) # or self.bar($(@))
  bar: (element) ->
    element.hide()
3 голосов
/ 26 сентября 2013

После проверки другого решения. Здесь что-то предстает для меня как наиболее полный образец с каждым и нажмите:

class MainApp
  self = []

  constructor: ->
    self = @

  toDoOnClick: (event) ->
    self.bar($(event.target)) #hide the clicked object

  bar: (element) ->
    element.hide()

  sampleMethod:->
    $(".myDiv").click (e) -> self.toDoOnClick(e)
    $('.element').each ->
      self.bar($(this))
...