Während dies ein älterer Beitrag ist, wollte ich der Konversation für zukünftige Googler etwas hinzufügen.
OP ist insofern richtig, als wir keine Funktionen in reinem CoffeeScript deklarieren können (mit Ausnahme der Idee, Back-Ticks zu verwenden, um reines JS in der CoffeeScript-Datei zu umgehen).
Was wir aber tun können, ist, die Funktion an das Fenster zu binden und im Wesentlichen etwas zu erhalten, das wir aufrufen können, als wäre es eine benannte Funktion. Ich sage dies nicht ist eine benannte Funktion, ich bin ein Weg , um zu tun , was ich OP vorstellen will tatsächlich tun (nennen wir eine Funktion wie foo (param) irgendwo im Code) unter Verwendung von reinem Coffeescript .
Hier ist ein Beispiel für eine Funktion, die in Coffeescript an das Fenster angehängt ist:
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
Hierbei werden Google Places verwendet, um Adressinformationen zurückzugeben und ein Formular automatisch auszufüllen.
Wir haben also einen Teil in einer Rails-App, der auf eine Seite geladen wird. Dies bedeutet, dass das DOM bereits erstellt wurde. Wenn wir die obige Funktion beim ersten Laden der Seite aufrufen (bevor der Ajax-Aufruf den Teil rendert), sieht jQuery das Element $ ('# property_street_address_1') nicht (vertrau mir - es hat nicht funktioniert). t).
Daher müssen wir google.maps.places.Autocomplete () verzögern, bis das Element auf der Seite vorhanden ist.
Wir können dies über den Ajax-Rückruf bei erfolgreichem Laden des Teils tun:
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
Hier machen wir also im Wesentlichen dasselbe wie beim Aufrufen von foo ()