Si bien esta es una publicación anterior, quería agregar algo a la conversación para futuros empleados de Google.
OP tiene razón en que no podemos declarar funciones en CoffeeScript puro (excluyendo la idea de usar ticks inversos para escapar JS puro dentro del archivo CoffeeScript).
Pero lo que podemos hacer es vincular la función a la ventana y esencialmente terminar con algo que podemos llamar como si fuera una función con nombre. No estoy diciendo que esto sea una función con nombre, estoy proporcionando una forma de hacer lo que imagino que OP quiere hacer (llamar a una función como foo (param) en algún lugar del código) usando CoffeeScript puro.
Aquí hay un ejemplo de una función adjunta a la ventana en 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
Esto está utilizando Google Places para devolver la información de la dirección para completar automáticamente un formulario.
Así que tenemos un parcial en una aplicación Rails que se está cargando en una página. Esto significa que el DOM ya está creado, y si llamamos a la función anterior en la carga de la página inicial (antes de que la llamada ajax muestre el parcial), jQuery no verá el elemento $ ('# property_street_address_1') (confía en mí, no lo hizo) t).
Por lo tanto, debemos retrasar google.maps.places.Autocomplete () hasta que el elemento esté presente en la página.
Podemos hacer esto a través de la devolución de llamada Ajax en la carga exitosa del parcial:
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
Entonces, aquí, esencialmente, estamos haciendo lo mismo que llamar a foo ()