2012-04-10 12 views
10

he escrito en una clase CoffeeScript, por ejemplo,Clase CoffeeScript no es accesible en javascript principal

class Example 
    constructor: -> 
    $.each [1, 2, 3], (key, value) => 
     @test = value 
    return @test 
    render: -> 
    alert @test 

y tengo esta clase como un archivo separado, Example.coffee

Ahora quieren ser capaces para crear una instancia en mi archivo principal javascript de esta manera:

d = new Example 
d.render() 

pero la clase no está definido, incluso cuando se incluye como una secuencia de comandos en la página, al igual que

<script src="Example.js></script> 
<script src="main.js"></script> 

¿Cómo se pone la clase a disposición del público para el archivo principal?

+1

marcado como duplicado: http://stackoverflow.com/questions/9287510/multiple-files-communication-with-coffeescript/9296803 –

Respuesta

25

Se puede declarar su clase para ser accesible a nivel mundial (por lo menos para los navegadores) declarando que estar en el window espacio de nombres:

class window.Example 
    constructor: -> 
    $.each [1, 2, 3], (key, value) => 
     @test = value 
    return @test 
    render: -> 
    alert @test 

Eso pondrá Example directamente en window. También puede decir class @Example en la mayoría de los casos.

De forma predeterminada, CoffeeScript ajusta cada archivo en un contenedor (function() { ... })() para evitar la contaminación del espacio de nombres. Esto se puede evitar mediante el suministro de -b al compilar su CoffeeScript:

-b, --bare
Compilar el código JavaScript sin la envoltura de seguridad de función de nivel superior.

pero esa podría no ser una opción para usted (o podría ser una opción desagradable). El enfoque habitual es declarar un espacio de nombres específico de la aplicación en algún lugar antes de cargar sus clases:

// Probably in a <script> in your top-level HTML... 
App = { }; 

espacio de nombres y luego sus clases de manera apropiada:

class App.Example 
    #... 

A continuación, se refieren a todo a través del espacio de nombres App.

+0

¿Hay alguna forma de configurar el espacio de nombres sin tener que recurrir a una etiqueta de script?No llegué muy lejos en mis intentos. ¡Gracias! –

+1

@MichaeldeSilva: en un entorno de navegador puede decir cosas como '@App? = {}' Antes de sus clases para inicializar 'window.App' si aún no está cerca. O podría decir 'class @ C' para poner sus clases en el alcance global si eso le parece. O puede usar un sistema de módulos como require.js. –

+0

Gracias por el consejo @mu –

4

Crear una variable global

window.Example = Example

10

Sé que este es un hilo viejo, pero en caso de que alguien más lo encuentre útil, declare su clase con "@" y se podrá acceder a los archivos .js fuera del archivo .coffee.

Así, en example.coffee:

class Introverted 
    honk: -> 
    alert "This class is visible within the .coffee file but not outside" 

class @Extroverted 
    honk: -> 
    alert "This class is visible inside and outside of the .coffee file" 

que se compila a example.js que luego pueden ser utilizados en example.html:

<script src="example.js"></script> 
<script> 
var p = new Extroverted(); // works fine 
p.honk(); 

var i = new Introverted(); // will fail with "Introverted is not defined" 
i.honk(); 
</script> 
+0

¡Solución elegante! –

+1

Esto es efectivamente lo mismo que la respuesta de 'mu es demasiado corta'. El '@ Extroverted' se compilará a' this.Extroverted', que en realidad es lo mismo que 'window.Extroverted' en este caso. – Nick

+1

Solo para agregar al comentario de Nick anterior, en caso de que alguien se esté preguntando ... la razón por la que esto funciona es porque '@' es un atajo para 'this' en coffeescript. Y como él dice, en el contexto anterior, "this" es "ventana", por lo que se está conectando Extraverted a la ventana, lo que hace que sea global. – markquezada

Cuestiones relacionadas