Хоча це старіший пост, я хотів додати щось до розмови для майбутніх співробітників Google.
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 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 ()