Método de syntax de llamada en CoffeeScript

Soy nuevo en CoffeeScript, y parece que tengo problemas con la syntax para los methods de llamada.

Aquí está el model de la tarjeta:

class exports.Card extends Backbone.Model defaults: pip: '4' suit: '♠' color: 'b' rows: -> rows = '4': [2, 0, 2] rows[@pip] 

Y la parte relevante de la plantilla:

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

que me está dando el error Uncaught TypeError: Object #<Object> has no method 'rows'

Específicamente, me pregunto si estoy usando una syntax incorrecta para el método de filas de la Tarjeta o si estoy simplemente entendiendo mal algo. ¡Gracias por adelantado!

Actualizar:

Por alguna razón, @card.property siempre funciona bien, pero @card.any_method() nunca lo hace. Ya he pasado por alto esto mediante el uso de properties, pero me encantaría que alguien pudiera explicar este comportamiento. ¡Gracias de nuevo!

Actualización 2:

Estoy usando http://brunchwithcoffee.com si es de ayuda para cualquier persona, y aquí está el file main.coffee para mostrar cómo se está creando la instancia de @card a la vista.

 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() 

Su syntax de llamada de método es correcta. Las reglas relevantes para CoffeeScript son:

  • Los paréntesis son opcionales para las llamadas a methods invocadas con arguments, es decir,

     object.method 1,2 

    o

     object.method(1,2) 
  • Los paréntesis son necesarios para llamadas a methods invocadas sin arguments, es decir,

     object.method() 

Para ver cómo funciona, intente ejecutar el siguiente código en el editor 'Try CoffeeScript' en el sitio de CoffeeScript:

 class A method: -> console.log "A" (new A()).method(); 

Como la syntax de la llamada al método es correcta, parece probable que el problema sea que la variable @card no es una instancia de la class exports.Card.

El problema es que pip no es una propiedad de la instancia de la Card ; es una propiedad de Card::defaults , por lo que Backbone lo convierte en un atributo de la instancia de la Card , no en una propiedad . Puede acceder al atributo de pip con

 card.get 'pip' 

o directamente como

 card.attributes.pip 

El motivo de esta distinción es que, en JavaScript, no hay forma de monitorear una propiedad para detectar cambios, lo que la Red troncal necesita hacer para despachar events. (Si modifica pip con card.set 'pip' , Backbone card.set 'pip' un evento de "change" , por ejemplo).

Por lo tanto, su código debería funcionar bien si solo cambia la última línea del método de rows :

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

( Nota: los getters / setters son compatibles en algunos entornos JS, lo que te permitiría mapear card.pip = ... a card.set 'pip', ... Ver el artículo de John Resig aquí . Backbone no usa este enfoque porque pretende ser compatible con todos los browseres modernos.)

Finalmente lo @card olvidé que la variable @card la que se @card reference en la plantilla no se había originado en el file main.coffee , sino que en realidad se estaba convirtiendo en JSON en CardView aquí:

 cardTemplate = require('templates/card') class exports.CardView extends Backbone.View tagName: 'div' className: 'card' render: -> $(@el).html cardTemplate(card: @model.toJSON()) @ 

Ahora tiene sentido por qué solo las variables funcionaban y no los methods: @card era en realidad una representación JSON de la instancia del model.

Gracias por todas las sugerencias / aclaraciones chicos – perdón por el error tonto: P