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でした。PostsController によってレンダリングされたビューでのみコードが実行されるように、 onposts.js.coffeeを使用してチェックですべてのコードをラップします。これはすべて 1 つの大きな application.js ファイルにコンパイルされますが、これで問題ありません。これはすべて完璧に機能します。idbody

ただし、ページの 1 つでフォームを送信した AJAX は、レンダリングする PostsController のアクションにヒットしますselect_customer.js.erb。このテンプレートでは、現在 で定義されているメソッドを呼び出しますが、posts.js.coffee何らかの理由で機能しなくなりました。

関連するすべてのファイルの小さな例を次に示します。

posts.js.コーヒー:

jQuery ->
  if $('#posts-new').length > 0
    keywordsAccordion()

keywordsAccordion = ->
  $('.accordion').accordion
    'active': 0,
    'collapsible': true

select_customer.js.erb

keywordsAccordion();

CoffeeScriptposts.js.coffeeはすべて名前空間か何かになるようにコンパイルしていますか? そして、他のjsテンプレートとは異なる方法で定義されたメソッドを呼び出す必要がありますか?

これはひどく混乱するかもしれませんが、誰かが私を助けてくれることにとても感謝しています.

4

1 に答える 1

1

各 coffeescript ファイルには名前空間が付けられているため、その関数は同じファイル内でのみ使用できます。そのkeywordsAccordion()ため、ファイル内でのみアクセスできposts.js.coffeeます。

window代わりに、これらの関数をオブジェクトにアタッチして、どこでも使用できるようにすることができます。

window.keywordsAccordion = ->
  ...

(グローバルスコープを参照して)の@keywordsAccordion = ->省略形であるも使用できると思いますthis.keywordsAccordion = ->this

于 2013-09-27T19:51:07.887 に答える