2011-08-16 16 views
8

El compilador coffeescript está, por alguna razón, envolviendo todos mis archivos .coffee en una función cuando se compilan. Por ejemplo, si tengo test.coffee:Coffeescript que envuelve archivos en una función

class TestClass 
    constructor: (@value) -> 

    printValue:() -> 
     alert(@value) 

printAValue =() -> 
    test = new TestClass() 
    test.printValue() 

en cuando me siento Test.js:

(function() { 
    var TestClass, printAValue; 
    TestClass = (function() { 
    function TestClass(value) { 
     this.value = value; 
    } 
    TestClass.prototype.printValue = function() { 
     return alert(this.value); 
    }; 
    return TestClass; 
    })(); 
    printAValue = function() { 
    var test; 
    test = new TestClass(); 
    return test.printValue(); 
    }; 
}).call(this); 

Mi simple archivo html no funcionará con esto:

<html> 
    <head> 
     <script src="test.js"></script> 
    </head> 
    <body onload="printAValue()"> 
    </body> 
</html> 

I no he trabajado con mucho JS antes, y no dudaría del compilador de café, pero ¿es la forma en que debería funcionar? Cómo

+0

Intente cambiar su línea coffeescript para pasar un valor al inicializador TestClass -'test = new TestClass ('hello world') ' – arunkumar

+0

Vea [mi respuesta aquí] [1] sobre el código compartido entre archivos/módulos JS. [1]: http://stackoverflow.com/questions/6951438/accessing-document-within-coffeescripts-default-wrapper/6951641#6951641 –

+0

esto es, con mucho, la pregunta más popular preguntó acerca de CoffeeScript ASI QUE. Consulte http://stackoverflow.com/q/6481986/66226, http://stackoverflow.com/q/4214731/66226, http: //stackoverflow.com/q/5693211/66226 ... –

Respuesta

7

Nunca agregue detectores de eventos en HTML. Añádalos a su JavaScript, preferiblemente en el mismo ámbito en el que define el controlador de eventos.

printAValue =() -> 
    test = new TestClass() 
    test.printValue() 

document.body.addEventListener('load', printAValue, false) 

Si es absolutamente necesario exportar algo para el ámbito global, la exportación al objeto de ventana:

window.printAValue =() -> 
    test = new TestClass() 
    test.printValue() 
+0

Bien, gracias por resolviendo ese problema Pero ahora estoy recibiendo un problema en el que si incluyo varios archivos js en mi HTML, no podrán acceder a las otras clases. ¿Es eso porque todos están siendo definidos en algún ámbito no global, y es ahí donde los estoy buscando? – DrPepper

+1

Sí, están todos envueltos en una función. Crea un objeto global namespase ('window.NS = {}') y exporta tus clases a ese espacio de nombres ('NS.TestClasses = TestClasses'). El espacio de nombres será accesible globalmente en todos los archivos. – katspaugh

+0

Bien, eso está funcionando. Gracias un montón. – DrPepper

9

Ver my answer here en código compartido entre jS archivos/módulos. Además, para su información, la función de envoltura es, por diseño, para evitar variables globales involuntarias. Puede deshabilitarlo pasando --bare a la herramienta de línea de comandos del compilador de café, pero es una buena práctica con una buena razón.

Cuestiones relacionadas