2011-01-12 32 views
19

tôi cóChạy một lớp CoffeeScript trên document.ready

class Main 
    test:-> 
     alert "yay!" 

trong coffeescript, và tôi muốn chạy mà bên index.html của tôi

<script> 
    $(function(){ 
     //and obv Main.test(); doesn't work 
    }); 
</script> 

có một lưu ý những điều này trên trang web , nó nói nó sẽ không hoạt động. Nhưng tôi không thể tìm ra cách để nó hoạt động. bất kỳ ý tưởng? tôi cần phải tìm hiểu những gì wrapper coffeescript đóng cửa là.

hoặc thực hiện coffeescript sau tài liệu.

thx!

+0

Câu trả lời ở đây giải thích phạm vi toàn cầu với kịch bản cà phê rất tốt: http : //stackoverflow.com/questions/4214731/coffeescript-global-variables – Marc

Trả lời

24

class Main

Hãy thử class @Main để thay thế.

obv Main.test(); không hoạt động

Phải. Nên là new Main().test() hoặc Main::test().

thực hiện coffeescript sau tài liệu.

Giả sử bạn đang thực hiện nó qua extras/coffee-script.js và sử dụng jQuery, có.

+3

chỉ cần một chút trợ giúp cho người đọc trong tương lai của câu hỏi này, nếu bạn bao gồm .coffee trực tiếp và biên dịch chúng với coffee.js, một điều kiện chủng tộc xảy ra, và nó không 't làm việc (nếu bạn biên dịch với CLI, đó là tất cả tốt) để có được điều này để làm việc, tôi đã làm: \t \t $ (function() { \t \t \t setTimeout (function() { new Main() }, 1000); \t \t}); hy vọng nó giúp. – Devrim

9

Coffeescript kết thúc tốt đẹp mã của bạn trong một cuộc gọi hàm để bạn không thể vô tình ghi đè lên các biến toàn cục.

Nếu bạn muốn bất kỳ biến, hàm hoặc lớp nào là toàn cầu (để chúng có thể được truy cập bởi các tệp khác), bạn cần phải làm cho chúng toàn cầu rõ ràng bằng cách đính kèm chúng vào this hoặc window.

# Stays within the function scope, so you can't access it outside the file 
myNotGlobalFunction -> return 

# Attaches it to `this` aka `window`, so can be accessed globally 
this.myGlobalFunction -> return 

# A shortcut using @ which is an alias to `this.` 
@myOtherGlobalFunction -> return 

này biên dịch để:

(function() { 
    myNotGlobalFunction(function() { 
    return; 
    }); 
    this.myGlobalFunction(function() { 
    return; 
    }); 
    this.myOtherGlobalFunction(function() { 
    return; 
    }); 
}).call(this); 
25

Để thực hiện Coffeescript sau document.ready bạn có thể sử dụng jQuery như thế này:

$ -> 
    # Put your function code here 
    init() 

gì đó đang làm đang chạy jQuery (function() {callback ...}) giống như phần 3 tại liên kết này: http://api.jquery.com/jQuery/

Mà về cơ bản nói điều này:

jQuery (gọi lại) Trả về: jQuery Mô tả: Ràng buộc một hàm được thực hiện khi DOM tải xong.

Tôi khai báo tất cả các lớp học, vv bên ngoài tài liệu đã sẵn sàng và sau đó gọi hàm init để làm cho nó chạy vào thời điểm thích hợp.

Tôi hy vọng điều đó sẽ hữu ích!

0

Tôi cũng đã gặp sự cố này trước đây.Trước hết, vì bạn đang định nghĩa một lớp, bạn cần khởi tạo nó. Sau đó, bạn có thể gọi cho bạn test chức năng trên dụ:

<script> 
    $(function(){ 
     var an_instance_of_main = new Main(); 
     an_instance_of_main.test(); 
    }); 
</script> 

Tuy nhiên, bạn có thể thấy rằng trình duyệt không thể tìm thấy lớp Main của bạn. Điều này là do khi CoffeeScript được biên dịch, nó kết thúc tốt đẹp một chức năng tự thực thi xung quanh định nghĩa lớp của bạn để ngăn không cho Main truy cập được toàn cầu. Nếu bạn muốn làm cho nó dễ tiếp cận toàn cầu, bạn có thể thêm tiền tố nó với cửa sổ:

class window.Main 
    test:-> 
     alert "yay!" 

hoặc gán nó sau khi xác định nó:

class Main 
    test:-> 
     alert "yay!" 

window.Main = Main 
Các vấn đề liên quan