2011-10-10 28 views
6

Tôi mới đến CoffeScript và tôi đã tự hỏi nếu có một cách viết các đoạn mã sau đây mà không cần tham khảo các ứng dụng biến toàn cục:Tham khảo tầng lớp phụ huynh trong CoffeeScript từ một callback jQuery

class App 

    constructor: -> 
     @ui = ui.init() 
     $('#content-holder a[rel!=dialog]').live 'click', -> 
      link = $(@).attr 'href' 
      app.loadUrl link 
      return false 

    loadUrl: (href) -> 
     # ... 

app = new App() 

Sử dụng chất béo mũi tên không hoạt động, như sau đó tôi đã làm mất tài liệu tham khảo cho các đối tượng jQuery, tức là

class App 
    constructor: -> 
     @ui = ui.init() 
     $('#content-holder a[rel!=dialog]').live 'click', => 
      # @ now references App 
      link = $(@).attr 'href' 
      this.loadUrl link 
      return false 

    loadUrl: (href) -> 
     # ... 

phần đầu tiên của mã làm việc, nhưng tôi muốn để thoát khỏi của biến toàn cầu nếu có thể :-)

Chúc mừng, Gaz.

+0

Các bạn đã thử '@loadUrl liên kết' thay vì 'this.loadUrl' Nếu điều đó không hoạt động, vui lòng đăng javascript đã biên dịch. – Gazler

+1

@something chỉ là một đường cú pháp cho this.something, afaik – Guard

+0

Điều đó sẽ không hoạt động, bởi vì @ (this) sẽ tham chiếu đến chức năng gọi lại ẩn danh. – Gaz

Trả lời

10

handler nhấp chuột của bạn nhận được một sự kiện được thông qua vào ... để bạn có thể tận dụng tốt nhất của cả hai thế giới với "mũi tên béo" mà không cần cũng phải tham khảo self:

constructor: -> 
    @ui = ui.init() 
    $('#content-holder a[rel!=dialog]').live 'click', (e) => 
     link = $(e.target).attr 'href' 
     @loadUrl link 
     return false 
+0

Cheeky, tôi thích nó! – Gaz

+1

'e.href' hoạt động tốt – mirelon

+0

Thực ra tôi đã có mũi tên 'béo', nhưng không thể lấy được phần tử tôi đã nhấp vào =) thx –

5

Vâng, CS chỉ là cú pháp cấp cao hơn cho JS.

Trong JS this chỉ có thể tham chiếu một đối tượng.

Mũi tên chất béo sử dụng đóng cửa để làm this bằng một mức độ cao hơn this, không có gì hơn, và đó là lý do tại sao nó quan trọng hơn this trong phạm vi của một callback

Mũi tên đơn giản, ngược lại, chỉ là một function bí danh, và đó là lý do tại sao this là phần tử DOM trong trường hợp đầu tiên.

Cuối cùng, @something được dịch một cách trivially thành this.something và không làm gì hơn.

Vì vậy, ý kiến ​​của tôi - lựa chọn tốt nhất của bạn thực sự đang thực hiện self = @ trước khi ràng buộc.

+1

Cảm ơn Guard. Tôi nghĩ CoffeeScript có thể có một thứ gì đó huyền diệu mà có thể có được xung quanh rác tự = @ tất cả các nơi :-) – Gaz

+0

@Gaz Trên thực tế, có một cách tốt hơn. Xem câu trả lời của tôi. –

+0

+1 cho "mũi tên béo sử dụng đóng cửa để làm cho điều này tương đương với cấp độ cao hơn", đây là lần đầu tiên tôi hiểu ý nghĩa sau 3 ngày học CS! – Josh

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