0

我最近开始在我的 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的检查包装所有代码,以确保代码仅在 PostsController 呈现的视图上运行。这一切都被编译成一个大的 application.js 文件,这对我来说很好。这一切都完美无缺。idbody

但是,在其中一个页面上提交的 AJAX 表单会触发 PostsController 中的一个操作,该操作会呈现select_customer.js.erb. 在这个模板中,它调用了一个现在定义在 中的方法posts.js.coffee,并且由于某种原因不再起作用。

以下是涉及的所有文件的一个小示例:

post.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以使其全部命名空间或其他内容?我现在需要以不同于其他 js 模板的方式调用其中定义的方法吗?

我意识到这可能非常令人困惑,但如果有人可以帮助我,我将非常感激。

4

1 回答 1

1

每个咖啡脚本文件都有命名空间,因此它的功能只能在同一个文件中使用。所以keywordsAccordion()只能在posts.js.coffee文件中访问。

您可以将这些函数附加到window对象上,使它们在任何地方都可用:

window.keywordsAccordion = ->
  ...

我相信您也可以使用@keywordsAccordion = ->,它是this.keywordsAccordion = ->this指全局范围)的简写

于 2013-09-27T19:51:07.887 回答