我最近开始在我的Rails 3.2.14应用程序中使用CoffeeScript。目前我们所有的javascript代码都混杂在application.js中,它也充当了我们的清单文件。我们的计划是将这些内容提取到控制器特定的代码中,以便将来更容易维护。在我们的application_helper.rb
文件中,我们有这个助手
def css_tag_id
"#{controller.controller_name}-#{controller.action_name}"
end
我们将此用于特定于页面的CSS和JavaScript。所以我的第一步是获取与PostsController相关的代码并将其放入新文件posts.js.coffee
中。我使用posts.js.coffee
上的id
检查body
中的所有代码,以确保代码仅在PostsController呈现的视图上运行。这一切都被编译成一个大的application.js文件,这对我很好。这一切都很完美。
但是,在其中一个页面上提交的AJAX表单会在PostsController中生成一个呈现select_customer.js.erb
的动作。在此模板中,它调用现在在posts.js.coffee
中定义的方法,由于某种原因不再有效。
以下是所涉及的所有文件的一个小例子:
posts.js.coffee:
jQuery ->
if $('#posts-new').length > 0
keywordsAccordion()
keywordsAccordion = ->
$('.accordion').accordion
'active': 0,
'collapsible': true
select_customer.js.erb
keywordsAccordion();
CoffeeScript是否正在编译posts.js.coffee
以使其全部为命名空间或其他内容?我现在需要以不同的方式调用其中定义的方法吗?
我意识到这可能非常令人困惑,但如果有人可以帮助我,我将非常感激。
答案 0 :(得分:1)
每个coffeescript文件都是命名空间,因此其功能仅在同一文件中可用。因此keywordsAccordion()
只能在posts.js.coffee
文件中访问。
您可以将这些功能附加到window
对象,使其在任何地方都可用:
window.keywordsAccordion = ->
...
我相信您也可以使用@keywordsAccordion = ->
,这是this.keywordsAccordion = ->
的简写(this
指的是全球范围)