2012-06-13 2 views
3

Я не знаю, все ли компиляторы coffeescript переносят свои скрипты в анонимные функции, но это то, что я вижу в Rails. Как отключить эту инкапсуляцию?Как не инкапсулировать Coffeescript

Я хочу поместить несколько инициализирующих функций в один файл coffeescript, а затем вызвать один из них из тега на странице <script> (чтобы каждая страница вызывала другой инициализатор). Этого не может быть, если инициализируемые функции инкапсулированы.

CoffeeScript функции инициализатора:

initializerA = -> console.log 'foo' 
initializerB = -> console.log 'bar' 

На странице Код:

<script>$(document).ready(initializerA)</script> 

Sys: кофе-рельсы 3.2.1, Rails 3.2.3, Ruby 1.9.3

+0

возможных дубликатов [Как использовать параметр «--bare» в Rails 3.1 для CoffeeScript?] (Http://stackoverflow.com/questions/6099342/how-can-i-use-option-bare-in-rails -3-1-for-coffeescript) –

+0

@TrevorBurnham, похоже. Тем не менее, я не мог найти этот вопрос, используя условия поиска, относящиеся к этому вопросу и его ответам, поэтому это должно иметь некоторую ценность. – JellicleCat

+0

Именно поэтому дубликаты закрываются, а не удаляются: это позволяет им указать путь к более каноническому вопросу. –

ответ

7

Документация Coffeescript гласит, что все сценарии w плохо быть обернутым анонимной функцией для инкапсуляции/безопасности. Для того, чтобы сделать что-то доступное в глобальном масштабе необходимо выполнить следующие действия:

window.myvar = myvar 
2

Вы можете поместить несколько в один файл, делая что-то вроде этого:

((Demo, $, undefined_) -> 
    Demo.utils = Demo.utils or {} 

    Demo.utils.bacon = (-> 
     alert("bacon called") 
    )() 

    Demo.utils.eggs = (-> 
     alert("eggs called") 
    )() 
) window.Demo = window.Demo or {}, jQuery 

Затем на странице просто вызвать соответствующий метод:

Demo.utils.bacon(); 

хорошее объяснение этого шаблона может быть found here.

+0

+1 для деталей. (Другому парню было немного легче переварить.) – JellicleCat

Смежные вопросы