2011-08-16 70 views
8

Trình biên dịch coffeescript, vì một lý do nào đó, gói tất cả các tệp .coffee của tôi trong một hàm khi chúng được biên dịch. Ví dụ, nếu tôi có test.coffee:Các tệp gói Coffeescript trong một hàm

class TestClass 
    constructor: (@value) -> 

    printValue:() -> 
     alert(@value) 

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

sau đó tôi nhận được 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); 

tập tin đơn giản html của tôi sẽ không làm việc với điều này:

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

tôi đã không làm việc với JS nhiều trước đây, và tôi sẽ không nghi ngờ trình biên dịch cà phê, nhưng là cách nó nên làm việc? Cách

+0

Hãy thử thay đổi dòng coffeescript của bạn để chuyển giá trị cho bộ khởi tạo TestClass -'test = new TestClass ('hello world') ' – arunkumar

+0

Xem [câu trả lời của tôi ở đây] [1] về mã chia sẻ giữa các tệp JS/mô-đun. [1]: http://stackoverflow.com/questions/6951438/accessing-document-within-coffeescripts-default-wrapper/6951641#6951641 –

+0

này được đến nay là câu hỏi phổ biến nhất được hỏi về CoffeeScript trên VÌ THẾ. Xem http://stackoverflow.com/q/6481986/66226, http://stackoverflow.com/q/4214731/66226, http: //stackoverflow.com/q/5693211/66226 ... –

Trả lời

7

Không bao giờ thêm trình xử lý sự kiện trong HTML. Thêm chúng vào JavaScript của bạn, tốt nhất là trong cùng phạm vi mà bạn xác định trình xử lý sự kiện.

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

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

Nếu bạn hoàn toàn cần phải xuất khẩu một cái gì đó với phạm vi toàn cầu, xuất khẩu sang các đối tượng cửa sổ:

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

Được rồi, cảm ơn giải quyết vấn đề đó. Nhưng bây giờ tôi nhận được một vấn đề mà nếu tôi bao gồm nhiều tập tin js trong HTML của tôi, họ không nhận được quyền truy cập vào mỗi lớp khác. Có phải đó là vì tất cả chúng đều được định nghĩa trong một phạm vi phi toàn cầu nào đó, và đó là nơi tôi đang tìm kiếm chúng? – DrPepper

+1

Có, tất cả chúng được bao bọc thành một chức năng. Tạo một số đối tượng namespase toàn cục ('window.NS = {}') và xuất các lớp của bạn vào không gian tên đó ('NS.TestClasses = TestClasses'). Không gian tên sẽ có thể truy cập trên toàn cầu trên các tệp. – katspaugh

+0

Được rồi, đó là tất cả công việc. Cảm ơn nhiều. – DrPepper

9

Xem my answer here vào việc chia sẻ mã JS giữa các tập tin/modules. Ngoài ra FYI chức năng bao bọc được thiết kế để ngăn chặn các biến toàn cầu không chủ ý. Bạn có thể vô hiệu hóa bằng cách chuyển --bare tới công cụ dòng lệnh trình biên dịch cà phê, nhưng đó là phương pháp hay nhất với lý do chính đáng.

Các vấn đề liên quan