2011-12-28 38 views
11

Khi sử dụng các lớp trong Coffeescript, tôi đã vấp phải một vấn đề lớn, hãy để tôi minh họa

class Bet 
    constructor:() -> 

    placeBet: -> 
    $('#chips > div').bind 'click', -> 
     amount = $(this).attr 'id' 
     pile = $(this) 
     switch amount 
     when "ten" then this.bet pile, amount #This line causes a problem 

    bet: (pile, amount) -> 
    alert 'betting!' 

Các cuộc gọi đến this.bet trên tạo ra các lỗi sau:

của router Lỗi Loại: Object # không có phương thức 'đặt cược'

Vì vậy, hiện tại phương pháp thể hiện của lớp học của tôi không được gọi, Làm cách nào tôi có thể gọi chính xác số đặt cược phương pháp của lớp học của tôi mà không có nó va chạm với bộ chọn jQuery này (Đó là những gì tôi cho là đang xảy ra bây giờ)?

Cảm ơn bạn rất nhiều trước!

+0

Bạn không thể đặt 'this' thành biến khác trước công cụ jQuery? 'var myself = this;' và sau đó sử dụng 'myself.bet' – PeeHaa

+2

Chỉ cần một lưu ý phụ, nhưng bạn thực sự nên lưu bộ nhớ đệm' $ (this) 'nếu bạn đang sử dụng nó nhiều hơn một lần. –

+0

@Josh Bạn có nghĩa là gán $ (this) cho một biến, và sau đó truy cập tất cả mọi thứ tôi cần thông qua nó? – jlstr

Trả lời

5

Hãy thử điều này:

class Bet 
    constructor:() -> 

    placeBet: -> 
    that = this 
    $('#chips > div').bind 'click', -> 
     amount = $(this).attr 'id' 
     pile = $(this) 
     switch amount 
     when "ten" then that.bet pile, amount #This line causes a problem 

    bet: (pile, amount) -> 
    alert 'betting!' 
+0

Tôi không quá quen thuộc với coffeescript. Rõ ràng, tôi sẽ sử dụng '' 'var''' trong JavaScript thông thường, nhưng tôi không thấy bất kỳ' '' var''' nào trong mã OP, vì vậy tôi không chắc nó có tồn tại trong coffeescript hay không. –

+8

@JoshSmith haha ​​bạn không phải làm điều đó trong cofeeScript lol – Neal

+1

Tuyệt vời, điều này hoạt động tốt. Tôi có thể hỏi một điều không? là nó thích hợp để làm điều đó theo cách này? hoặc là có một mô hình tốt hơn để thực hiện điều này? Có lẽ ngay cả Coffeescript cũng có cú pháp để tham chiếu (lớp)? Tôi mới 100% với Coffeescript, vì vậy tôi tự hỏi ... Đó là một giải pháp tuyệt vời. Có lẽ tôi đã mong đợi nó sẽ khó khăn hơn để giải quyết vấn đề này. – jlstr

0

Bạn kịch bản biến thành này:

var Bet; 

Bet = (function() { 

    function Bet() {} 

    Bet.prototype.placeBet = function() { 
    return $('#chips > div').bind('click', function() { 
     var amount, pile; 
     amount = $(this).attr('id'); 
     pile = $(this); 
     switch (amount) { 
     case "ten": 
      return this.bet(pile, amount); //<< you cannot do this!!! 
     } 
    }); 
    }; 

    Bet.prototype.bet = function(pile, amount) { 
    return alert('betting!'); 
    }; 

    return Bet; 

})(); 

gì bạn cần là một tham chiếu đến _self đó là được đối tượng Bet:

class Bet 
    constructor:() -> 

    placeBet: -> 
    _self = this 
    $('#chips > div').bind 'click', -> 
     amount = $(this).attr 'id' 
     pile = $(this) 
     switch amount 
     when "ten" then _self.bet pile, amount #This line causes a problem 

    bet: (pile, amount) -> 
    alert 'betting!' 
43

Anothe Giải pháp r là sử dụng mũi tên chất béo CoffeeScript trong trình xử lý sự kiện nhấp chuột sau đó phạm vi của bạn sẽ giống như khi bạn ở bên trong hàm placeBet. Sau đó, bạn sẽ sử dụng e.currentTarget để tham chiếu đến đối tượng mục tiêu thay vì sử dụng $(this)

class Bet 
    constructor: -> 

    placeBet: -> 
    $('#chips > div').bind 'click', (e) => 
     target = $(e.currentTarget) 
     amount = target.attr 'id' 

     switch amount 
     when "ten" then @bet target, amount #This line causes a problem 

    bet: (pile, amount) -> 
    alert 'betting!' 
+0

Đây là một Sandro đẹp! Tôi cần để xem lại cách mũi tên chất béo hoạt động như thế nào, bây giờ nó vẫn khiến tôi đau đầu để hiểu nó Cảm ơn giải pháp này! – jlstr

+0

+1 Cảm ơn bạn, tôi vẫn sử dụng cách cũ của $ .proxy-ing này vào gọi hàm. –

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