Chociaż jest to starszy post, chciałem dodać coś do rozmowy dla przyszłych pracowników Google.
OP ma rację, ponieważ nie możemy deklarować funkcji w czystym CoffeeScript (pomijając pomysł użycia back-ticków do ucieczki czystego JS w pliku CoffeeScript).
Ale to, co możemy zrobić, to powiązać funkcję z oknem i zasadniczo otrzymać coś, co możemy nazwać tak, jakby to była nazwana funkcja. Nie twierdzę, że jest to nazwana funkcja, zapewniam sposób zrobienia tego, co wyobrażam sobie, że OP chce faktycznie zrobić (wywołać funkcję taką jak foo (param) gdzieś w kodzie) przy użyciu czystego CoffeeScript.
Oto przykład funkcji dołączonej do okna w skrypcie 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
To jest używanie Miejsc Google do zwracania informacji adresowych w celu automatycznego wypełnienia formularza.
Mamy więc fragment w aplikacji Rails, który jest ładowany na stronę. Oznacza to, że DOM jest już utworzony, a jeśli wywołamy powyższą funkcję przy początkowym załadowaniu strony (zanim wywołanie AJAX wyrenderuje częściową część), jQuery nie zobaczy elementu $ ('# property_street_address_1') (zaufaj mi - nie udało się) t).
Musimy więc opóźnić google.maps.places.Autocomplete () do momentu pojawienia się elementu na stronie.
Możemy to zrobić za pomocą wywołania zwrotnego Ajax po pomyślnym załadowaniu częściowej:
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
Więc tutaj robimy to samo, co wywołanie foo ()