2011-08-26 82 views
6

我是CoffeeScript的新手,我似乎遇到了調用方法的語法問題。CoffeeScript中的方法調用語法

這裏的顯卡型號:

class exports.Card extends Backbone.Model 
    defaults: 
    pip: '4' 
    suit: '♠' 
    color: 'b' 

    rows: -> 
    rows = 
     '4': [2, 0, 2] 
    rows[@pip] 

和模板的相關部分:

<ul class="col cols-<%= @card.rows()[0] %>"> 

這是給我的錯誤Uncaught TypeError: Object #<Object> has no method 'rows'

具體來說,我想知道如果我對卡片的行方法使用不正確的語法,或者我只是誤解了某些東西。提前致謝!

更新:

出於某種原因,@card.property一直工作正常,但@card.any_method()從來不會。我現在通過使用屬性來解決這個問題,但如果有人能夠解釋這種行爲,我會很喜歡它。再次感謝!

更新2:

我使用http://brunchwithcoffee.com如果它是任何人幫助,而這裏的main.coffee文件來說明如何創建和傳遞給視圖的@card實例。

window.app = {} 
app.routers = {} 
app.models = {} 
app.collections = {} 
app.views = {} 

Card = require('models/card_model').Card 
MainRouter = require('routers/main_router').MainRouter 
HomeView = require('views/home_view').HomeView 
CardView = require('views/card_view').CardView 

# app bootstrapping on document ready 
$(document).ready -> 
    app.initialize = -> 
    app.routers.main = new MainRouter() 
    app.views.home = new HomeView() 
    app.views.card = new CardView(model: new Card(color: 'r', suit: '♥', pip: '7')) 
    app.routers.main.navigate 'home', true if Backbone.history.getFragment() is '' 
    app.initialize() 
    Backbone.history.start() 
+1

是如何'@ card'產生的?作爲'new exports.Card'?它是否通過測試'@card instanceof exports.Card'? –

+0

已更新,以顯示如何創建@card – mportiz08

+0

樣式提示:您可以編寫'{Card} = require'models/card_model''而不是'Card = require('models/card_model')。Card'。 –

回答

14

您的方法調用語法是正確的。對於CoffeeScript的相關規則是:

  • 括號是可選的帶參數調用方法調用IE

    object.method 1,2 
    

    object.method(1,2) 
    
  • 括號都需要不帶任何參數調用方法調用即

    object.method() 
    

要了解這個問題,請嘗試運行下面的代碼的「試用CoffeeScript的」關於CoffeeScript的網站編輯:

class A 
    method: -> 
    console.log "A" 

(new A()).method(); 

因爲你的方法調用語法是正確的它很可能是問題是, @card變量不是exports.Card類的一個實例。

+0

嗯,我真的很困惑,然後 - @卡肯定是卡類的一個實例,因爲我能夠安全地在視圖 – mportiz08

+0

之前的行之一<%= @ card.pip%>你是對的 - @卡實際上是toJSON()相當於我以爲它是 – mportiz08

1

問題是pip不是Card實例的屬性;它是Card::defaults的財產,因此Backbone然後使其成爲Card實例的屬性-不是財產。你可以用

card.get 'pip' 

或訪問pip屬性直接作爲

card.attributes.pip 

這樣做的理由的區別是,在JavaScript中,有沒有辦法來監控更改屬性,其骨幹需要做的以分派事件。 (如果修改pipcard.set 'pip',然後骨幹觸發一個"change"事件,例如。)

所以,你的代碼應該可以正常工作,如果你只是改變了rows方法的最後一行:

rows: -> 
    rows = 
    '4': [2, 0, 2] 
    rows[@get 'pip'] 

注: getter/setter方法在一些 JS環境的支持,這將讓你映射到card.pip = ...card.set 'pip', ...約翰Resig的文章就可以了here,因爲它的目標是兼容的骨幹不使用這種方法。與所有現代瀏覽器ISH)

+0

感謝澄清屬性與屬性,但我仍然收到'沒有方法'錯誤時調用任何方法@卡 – mportiz08

0

終於找到它了 - 我忘了,在模板中引用的@card變量沒有從main.coffee文件起源 - 它實際上被轉換成JSON在這裏CardView

cardTemplate = require('templates/card') 

class exports.CardView extends Backbone.View 
    tagName: 'div' 
    className: 'card' 

    render: -> 
    $(@el).html cardTemplate(card: @model.toJSON()) 
    @ 

現在,這是有道理的,爲什麼只有變量進行工作,而不是方法 - @card竟是模型實例的JSON表示。

感謝所有的建議/澄清傢伙 - 遺憾的愚蠢的錯誤:P