虽然这是一篇较早的帖子,但我想为未来的 Google 员工添加一些内容。
OP 是正确的,因为我们不能在纯 CoffeeScript 中声明函数(不包括在 CoffeeScript 文件中使用反引号转义纯 JS 的想法)。
但是我们可以做的是将函数绑定到窗口,最终得到我们可以调用的东西,就好像它是一个命名函数一样。我不是说这个 is 一个命名函数,我提供了一种方法来做我想象的 OP 想要实际做的事情(在代码中的某处调用像 foo(param) 这样的函数)使用纯 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 地方信息返回地址信息以自动填充表单。
所以我们在 Rails 应用程序中有一个部分正在加载到页面中。这意味着 DOM 已经创建,如果我们在初始页面加载时调用上面的函数(在 ajax 调用呈现部分之前),jQuery 将看不到 $('#property_street_address_1') 元素(相信我 - 它没有' t)。
所以我们需要延迟 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() 是一样的