Хотя это старый пост, я хотел добавить кое-что к разговору для будущих гуглеров.
OP верен в том, что мы не можем объявлять функции в чистом CoffeeScript (за исключением идеи использования обратных тиков для выхода из чистого JS внутри файла CoffeeScript).
Но что мы можем сделать, так это привязать функцию к окну и, по сути, получить то, что мы можем вызвать, как если бы это была именованная функция. Я не о том , это будет именованная функция, я обеспечиваю способ сделать то , что я полагаю , ОП хочет на самом деле сделать (вызвать функцию как Foo (пары) где - то в коде) с использованием чистого CoffeeScript.
Вот пример функции, прикрепленной к окну в coffeescript:
window.autocomplete_form = (e) ->
autocomplete = undefined
street_address_1 = $('#property_street_address_1')
autocomplete = new google.maps.places.Autocomplete(street_address_1[0], {})
google.maps.event.addListener autocomplete, "place_changed", ->
place = autocomplete.getPlace()
i = 0
while i < place.address_components.length
addr = place.address_components[i]
st_num = addr.long_name if addr.types[0] is "street_number"
st_name = addr.long_name if addr.types[0] is "route"
$("#property_city").val addr.long_name if addr.types[0] is "locality"
$("#property_state").val addr.short_name if addr.types[0] is "administrative_area_level_1"
$("#property_county").val (addr.long_name).replace(new RegExp("\\bcounty\\b", "gi"), "").trim() if addr.types[0] is "administrative_area_level_2"
$("#property_zip_code").val addr.long_name if addr.types[0] is "postal_code"
i++
if st_num isnt "" and (st_num?) and st_num isnt "undefined"
street1 = st_num + " " + st_name
else
street1 = st_name
street_address_1.blur()
setTimeout (->
street_address_1.val("").val street1
return
), 10
street_address_1.val street1
return
Это использует Google Адреса для возврата адресной информации для автоматического заполнения формы.
Итак, у нас есть партиал в приложении Rails, который загружается на страницу. Это означает, что модель DOM уже создана, и если мы вызовем указанную выше функцию при начальной загрузке страницы (до того, как вызов ajax отобразит фрагмент), jQuery не увидит элемент $ ('# property_street_address_1') (поверьте мне, это не было) т).
Поэтому нам нужно отложить google.maps.places.Autocomplete () до тех пор, пока элемент не появится на странице.
Мы можем сделать это с помощью обратного вызова Ajax при успешной загрузке партиала:
url = "/proposal/"+property_id+"/getSectionProperty"
$("#targ-"+target).load url, (response, status, xhr) ->
if status is 'success'
console.log('Loading the autocomplete form...')
window.autocomplete_form()
return
window.isSectionDirty = false
Итак, здесь, по сути, мы делаем то же самое, что вызываем foo ()