2011-08-26 83 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