虽然这是一篇较旧的文章,但我想在对话中添加一些内容,以便将来的Google员工使用。
OP是正确的,因为我们不能在纯CoffeeScript中声明函数(不包括使用反引号在CoffeeScript文件中转义纯JS的想法)。
但是我们可以做的是将函数绑定到窗口,并最终得到可以调用的东西,就好像它是命名函数一样。我不是在说这是一个命名函数,而是提供一种使用纯CoffeeScript进行OP实际想做的事情的方法(在代码中的某个地方调用foo(param)之类的函数)。
这是一个附加到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()相同的操作