La méthode de la Syntaxe d'Appel en CoffeeScript
Je suis nouveau sur CoffeeScript, et il me semble avoir des problèmes avec la syntaxe de l'appel de méthodes.
Voici le modèle de la Carte:
class exports.Card extends Backbone.Model
defaults:
pip: '4'
suit: '♠'
color: 'b'
rows: ->
rows =
'4': [2, 0, 2]
rows[@pip]
Et la partie pertinente du modèle:
<ul class="col cols-<%= @card.rows()[0] %>">
qui me donne l'erreur Uncaught TypeError: Object #<Object> has no method 'rows'
Plus précisément, je me demande si je suis en utilisant une syntaxe incorrecte pour les lignes de la méthode de la Carte ou si je suis juste un malentendu quelque chose. Merci à l'avance!
Mise à jour:
Pour une raison quelconque, @card.property
fonctionne toujours très bien, mais @card.any_method()
ne le fait jamais. J'ai contourné le moment à l'aide de propriétés, mais j'aimerais que quelqu'un était en mesure d'expliquer ce comportement. Merci encore!
Mise à jour 2:
Je suis en utilisant http://brunchwithcoffee.com si c'est une aide à toute personne, et voici le main.coffee
fichier à montrer comment le @card
instance est créée et transmise à la vue.
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()
- Comment a été
@card
créé? Commenew exports.Card
? Est-il passer le test@card instanceof exports.Card
? - mis à jour pour montrer comment l' @la carte est en cours de création
- Conseils de Style: Vous pouvez écrire
{Card} = require 'models/card_model'
au lieu deCard = require('models/card_model').Card
.
Vous devez vous connecter pour publier un commentaire.
Votre appel de méthode syntaxe est correcte. Les règles pertinentes pour CoffeeScript sont:
Les parenthèses sont facultatives pour les appels de méthode invoquée avec des arguments ie
ou
Les parenthèses sont nécessaires pour les appels de méthode appelée sans arguments ie
Pour voir comment cela fonctionne, essayez d'exécuter le code suivant sur le 'Essayer CoffeeScript de l'éditeur sur la CoffeeScript site:
Depuis votre appel de méthode syntaxe est correcte, il semble probable que le problème est que le @carte de variable n'est pas une instance de l'exportation.Carte de classe.
<%= @card.pip %>
l'une des lignes dans la vueLe problème est que
pip
n'est pas une propriété de laCard
exemple; c'est une propriété deCard::defaults
, sorte d'épine Dorsale puis lui fait un attribut de laCard
exemple—n'est pas un propriété. Vous pouvez accéder à lapip
attribut avecou directement en tant que
La raison de cette distinction est que, en JavaScript, il n'y a aucun moyen de surveiller une propriété de changements, dont l'épine Dorsale doit faire afin de dispatcher les événements. (Si vous modifiez
pip
aveccard.set 'pip'
, puis épine Dorsale déclenche un"change"
événement, par exemple.)Ainsi, votre code doit fonctionner correctement si vous venez de changer la dernière ligne de la
rows
méthode:(Remarque: Getters/setters sont pris en charge dans certains JS environnements, ce qui vous permettra de carte
card.pip = ...
àcard.set 'pip', ...
Voir John Resig de l'article ici. Épine dorsale n'utilise pas cette méthode, car elle vise à être compatible avec tous les-ish navigateurs.)Enfin compris--j'ai oublié que le
@card
variable référencée dans le modèle n'a pas à l'origine de lamain.coffee
fichier--il y a effectivement converties en JSON dans leCardView
ici:Maintenant, il fait sens pourquoi seules les variables étaient de travail et non des méthodes --
@card
était en fait une représentation JSON de l'instance du modèle.Merci pour toutes les suggestions/précisions les gars--désolé pour l'erreur stupide 😛