Хотя это более старая запись, я хотел добавить кое-что в беседу для будущих пользователей Google.
OP верен в том смысле, что мы не можем объявлять функции в чистом CoffeeScript (исключая идею использования обратных тиков для экранирования чистого JS внутри файла CoffeeScript).
Но то, что мы можем сделать, это связать функцию с окном и по сути получить нечто, что мы можем вызвать, как если бы это была именованная функция. Я не утверждаю, что является именованной функцией, я предоставляю способ сделать то, что, как мне кажется, OP действительно хочет сделать (вызвать функцию, подобную foo (param) где-то в коде), используя чистый 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 Places для возврата информации об адресе для автоматического заполнения формы.
Итак, у нас есть часть в приложении 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 ()