Доступ к переменным в классе CoffeeScript - PullRequest
3 голосов
/ 03 января 2012

В следующем коде у меня сложилось впечатление, что использование «жирной стрелки» позволит мне получить доступ к переменным класса. Вместо этого, независимо от жирной или тощей стрелки, я не могу получить доступ к переменной @accounts.

Есть предложения?

class MyClass
  accounts:[]
  constructor: (@accounts) -> 
    ($ '.the_buttons').live 'click', bind_clicks

  bind_clicks = (event) -> 
    console.log @accounts

jQuery -> 
  m = new MyClass([1, 2, 3])

Спасибо.

Обновление

Похоже, что раньше я набрал опечатку, что вызвало небольшую проблему.

Вот код, который делает свое дело

class MyClass
  accounts:[]
  constructor: (@accounts) -> 
    ($ '.the_buttons').live 'click', (event) => bind_clicks(event)

  bind_clicks: (event) => 
    console.log @accounts

jQuery -> 
  m = new MyClass([1, 2, 3])

Однако, странно прибегать к тому, чтобы сделать bind_clicks публичным методом.

Ответы [ 4 ]

1 голос
/ 24 сентября 2012

Вы можете сделать это

class MyClass
  bind_clicks = (event) -> 
    console.log @accounts

  accounts:null
  constructor: (@accounts) -> 
    ($ '.the_buttons').live 'click', bind_clicks


jQuery -> 
  m = new MyClass([1, 2, 3])

bind_clicks объявляется ДО методов экземпляра.Это личное.НО, это метод частного класса.Это создаст закрытие, вот почему.Я бы предложил использовать _bind_clicks, префикс подчеркивания - это общее соглашение для определения частных методов.Так как в javascript его нет на самом деле.

Будьте осторожны и при объявлении учетных записей: [], я бы предложил учетные записи: ноль, подробнее об этом: http://html5stars.com/?p=148

0 голосов
/ 03 января 2012

Вы можете сделать bind_clicks приватными следующим образом:

class MyClass
  accounts:[]
  constructor: (@accounts, @button) ->
    bind_clicks = (event) =>
      console.log @accounts 
    @button.click bind_clicks

class Button
  click: (@f) ->
  do_click: -> @f('event') 

button = new Button()
m = new MyClass([1, 2, 3], button)
console.log m.bind_clicks # undefined (private)
button.do_click() # [1, 2, 3]
0 голосов
/ 03 января 2012

Вы можете попробовать это: http://jsfiddle.net/zp6LJ/1/

Для достижения того, что вы ищете, необходимо определить приватный метод в функции конструктора.

class MyClass
  accounts:[]
  constructor: (@accounts) -> 
    bind_clicks = (event) =>
      console.log @accounts

    $('.the_buttons').click bind_clicks

jQuery -> 
  m = new MyClass([1, 2, 3])
0 голосов
/ 03 января 2012

Еще один возможный способ сделать это.Это очень похоже на ваше.

class MyClass
  constructor: (@accounts) -> 
    $('body').live 'click', @bind_clicks

  bind_clicks: (event) => 
    console.log @accounts

$ ->
  m = new MyClass([1, 2, 3])

Не цитируйте меня по этому поводу, но я не думаю, что у JS есть какое-либо понятие публичных / частных методов.Я полагаю, если вы не хотите раскрывать метод, вы могли бы сделать это вместо этого.Но вы можете рискнуть или повторить себя, если будете использовать этот метод более одного раза.

class MyClass
  constructor: (@accounts) -> 
    $('body').live 'click', (event) => 
      console.log @accounts

$ ->
  m = new MyClass([1, 2, 3])

Удачи!Сандро

примечание: я ограничил события из тела, чтобы проверить код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...