Mặc dù đây là một bài đăng cũ hơn, nhưng tôi muốn thêm điều gì đó vào cuộc trò chuyện dành cho các nhân viên Google trong tương lai.
OP đúng ở chỗ chúng ta không thể khai báo các hàm trong CoffeeScript thuần túy (loại trừ ý tưởng sử dụng dấu tích để thoát JS thuần túy bên trong tệp CoffeeScript).
Nhưng những gì chúng ta có thể làm là liên kết hàm với cửa sổ và về cơ bản kết thúc với một thứ mà chúng ta có thể gọi như thể nó là một hàm được đặt tên. Tôi không nói rõ đây là một hàm được đặt tên, tôi đang cung cấp một cách để thực hiện những gì tôi tưởng tượng OP muốn thực sự làm (gọi một hàm như foo (param) ở đâu đó trong mã) bằng cách sử dụng CoffeeScript thuần túy.
Đây là một ví dụ về một hàm được đính kèm vào cửa sổ trong 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
Điều này đang sử dụng Google Địa điểm để trả lại thông tin địa chỉ nhằm tự động điền vào biểu mẫu.
Vì vậy, chúng tôi có một phần trong ứng dụng Rails đang được tải vào một trang. Điều này có nghĩa là DOM đã được tạo và nếu chúng ta gọi hàm ở trên khi tải trang ban đầu (trước khi lệnh gọi ajax hiển thị một phần), jQuery sẽ không nhìn thấy phần tử $ ('# property_street_address_1') (tin tôi đi - nó không có " t).
Vì vậy, chúng ta cần trì hoãn google.maps.places.Autocomplete () cho đến sau khi phần tử hiện diện trên trang.
Chúng tôi có thể thực hiện việc này thông qua lệnh gọi lại Ajax khi tải thành công một phần:
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
Vì vậy, ở đây, về cơ bản, chúng tôi đang làm điều tương tự như gọi foo ()