2011-08-04 30 views
7

Trong chức năng mũi tên béo của lớp coffeescript, làm thế nào tôi có thể truy cập vào phạm vi của lớp cũng như chức năng?Các lớp học và phạm vi Coffeescript và mũi tên béo và mỏng

Ví dụ:

class Example 
    foo: -> 
    $('.element').each => # or -> 
     @bar($(this))  # I want to access 'bar' as well as the jquery element 
    bar: (element) -> 
    element.hide() 

Vì vậy, trong ví dụ này, nếu tôi sử dụng a => thì @ dùng để chỉ này của lớp nhưng 'này' được thì sai, trong khi đó nếu tôi sử dụng một -> cho mỗi cái, thì 'cái này' được sắp xếp một cách chính xác nhưng sau đó làm thế nào để tôi tham chiếu đến thanh chức năng của lớp?

Cảm ơn!

+0

Tôi đã tìm thấy giải pháp tạm thời: Sử dụng -> và sau đó tham chiếu thanh bằng cách sử dụng Ví dụ :: bar. Nó hoạt động nhưng nó xấu xí. Bất cứ ai có bất kỳ giải pháp đẹp hơn? –

Trả lời

10

Đó là vì trong CoffeeScript @ là bí danh cho this tức là khi bạn biên dịch .coffee thành .js @ sẽ được thay thế bằng this.

Nếu Example::bar là xấu xí, tôi không nghĩ rằng có các giải pháp 'đẹp hơn'.

Bạn có thể lưu trữ một tham chiếu đến this trước khi gọi .each:

class Example 
    foo: -> 
    self = @ 
    $('.element').each -> 
     self.bar($(this)) # or self.bar($(@)) 
    bar: (element) -> 
    element.hide() 
+0

Cảm ơn mak. Câu trả lời tốt. Nó cho thấy tôi đã không bỏ lỡ một cái gì đó rõ ràng và tôi cũng thích tự = @ tùy chọn. Tôi cần phải có suy nghĩ về điều đó. Vẫn quen với nó, nhưng thích nó. –

+0

Trên một ghi chú riêng biệt (theo kiểu), bạn nghĩ gì về cú pháp ($ '.foo') thay vì $ ('. Foo')? Topfunky đã cố gắng để đẩy phong cách đầu tiên nhưng tôi chưa quyết định ... –

+0

Cá nhân tôi tìm thấy $ ('. Foo') dễ đọc hơn. – mak

16

Trong khi mak là đúng, ông thất bại trong việc chỉ ra rằng trong kịch bản cà phê bạn hiếm khi cần phương pháp each jQuery, mà như bạn thấy, đấm của bạn bối cảnh thực hiện trong khuôn mặt mà không có sự cho phép của bạn.

class Example 
    foo: -> 
    for element in $('.element') 
     @bar $(element) 

    bar: (element) -> 
    element.hide() 

Tính năng lặp của tập lệnh cà phê hỗ trợ khái niệm each mà không có bất kỳ mã thư viện tùy chỉnh thực tế nào. Và họ cũng không tạo ra một phạm vi mới hoặc bối cảnh có nghĩa là bạn không cần một mũi tên chất béo của bất cứ loại nào.

+0

Tốt thứ Squeegy! Bạn hoàn toàn đúng. Tôi đã để lại câu trả lời của mak như là một trong những chấp nhận, nhưng cách của bạn là rất nhiều neater - và con đường để đi. Tôi đã đưa ra bản dịch coffeescript với sự chuyển đổi của một số js cũ, đó là lý do tại sao tôi lại gặp vấn đề này nhưng bây giờ tôi biết rõ hơn. Cảm ơn. –

3

Sau khi kiểm tra giải pháp khác. Ở đây, một thứ gì đó xuất hiện cho tôi là mẫu hoàn chỉnh nhất với mỗi mẫu và nhấp vào:

class MainApp 
    self = [] 

    constructor: -> 
    self = @ 

    toDoOnClick: (event) -> 
    self.bar($(event.target)) #hide the clicked object 

    bar: (element) -> 
    element.hide() 

    sampleMethod:-> 
    $(".myDiv").click (e) -> self.toDoOnClick(e) 
    $('.element').each -> 
     self.bar($(this)) 
Các vấn đề liên quan