jQuery связывать события с Rails / Coffeescript?

12

Итак, в app/assets/javascript/faye.js.coffee.erb у меня есть следующее:

$('#room_tag').bind('blur', () ->
   alert('Hey!')
)

Весь другой код в нем, такой как: sendmessage('room', 'message'), работает нормально. И я могу скопировать и вставить код, сгенерированный из вышеприведенного блока, и вставить его в Chrome, он отлично работает. Я предполагаю, что это потому, что это рельсы или coffeescript?, либо в одном из них, обертывает весь файл в:

(function() {
  // your generated code here
}).call(this);

Также было бы для меня способом доступа к методам, которые там определены? Можно ли определить метод там, не присваивая его переменной?

  • 0
    Я не знаю, я только видел это и ... хотел немного кофе ...
  • 0
    Вторая часть этого вопроса в основном дублирует stackoverflow.com/questions/5211638/… Посмотрите мой ответ там, объясняя цель оболочки. (Хотя в этом случае обертка не вызывает проблемы, как говорит Питер в своем ответе.)
Теги:
coffeescript

1 ответ

28
Лучший ответ

1) Скорее всего, ваш вызов .bind выполняется слишком рано, прежде чем документ будет готов и, следовательно, ничего не сделает. Оберните его при вызове $(document).ready, как этот

    $(document).ready ->
      $('#room_tag').bind 'blur', ->
        alert 'Hey!'

И на самом деле симпатичный ярлык для этого, поскольку функция jQuery по умолчанию $ является псевдонимом для $(document).ready, вы можете просто сделать:

$ ->
  $('#room_tag').bind 'blur', ->
    alert 'Hey!'

2) Это coffeescript, который обертывает все в определении самоисполняемой функции.

3) Если вы хотите сделать глобальную функцию в coffeescript, явно назначьте ее как свойство глобального объекта window

    window.myFunc = (arg1) ->
      alert arg1

2) и 3) четко объяснены в Документах CoffeeScript

  • 0
    Из Coffee Docs The usual caveats about CoffeeScript apply — your inline scripts will run within a closure wrapper, so if you want to expose global variables or functions, attach them to the window object.
  • 0
    Точно, звучит как # 1, здесь ответ. Вы можете подтвердить это, проверив $('#room_tag').length . Если это 1 , элемент существует во время выбора; если это 0 , это не так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню