Ruby on rails 3.1 CoffeeScript和Backbone.js出现未捕获类型错误

Ruby on rails 3.1 CoffeeScript和Backbone.js出现未捕获类型错误,ruby-on-rails-3.1,backbone.js,coffeescript,Ruby On Rails 3.1,Backbone.js,Coffeescript,Rails应用程序、学习咖啡脚本和Backbone.js: Uncaught TypeError: Cannot use 'in' operator to search for 'id' in easy _.extend.setbackbone.js:205 Backbone.Modelbackbone.js:142 Gamegames.js:13 (anonymous function)games.js:34 jQuery.Callbacks.firejquery.js:1047 jQuery

Rails应用程序、学习咖啡脚本和Backbone.js:

Uncaught TypeError: Cannot use 'in' operator to search for 'id' in easy
_.extend.setbackbone.js:205
Backbone.Modelbackbone.js:142
Gamegames.js:13
(anonymous function)games.js:34
jQuery.Callbacks.firejquery.js:1047
jQuery.Callbacks.self.fireWithjquery.js:1165
jQuery.extend.readyjquery.js:436
DOMContentLoadedjquery.js:924
下面是代码games.js.coffee

jQuery ->
  root = global ? window
  class Game extends Backbone.Model
    initialize: (@n, @diff) ->
      console.log "--> Game.initialize()"
    difficulty: ->
      @diff
    name: ->
      @n
  # Make class Game globally available
  root.Game = Game
  my_game = new Game('easy', 'hard')
  console.log "my_game.name(), my_game.difficulty() --> #{my_game.name()}, #  {my_game.difficulty()}"

我遗漏了一些东西,但很难弄清楚什么…

主干模型构造函数期望一个字典对象,其中包含将在该模型上设置的键和值。您没有提供对象,而是提供了两个字符串。该错误是由于主干尝试遍历对象而导致的,但由于您不能合法地执行(键入“easy”),因此会爆炸

您也不应该对模型数据使用属性。您应该在实例化时使用对象或
set()
get()
。因此,如果我可以更正您的代码:

jQuery ->
  root = global ? window
  class Game extends Backbone.Model
    initialize: ->
      console.log "--> Game.initialize()"
    difficulty: ->
      @get 'diff'
    name: ->
      @get 'n'
  # Make class Game globally available
  root.Game = Game
  my_game = new Game n: 'easy', diff: 'hard'
  console.log "my_game.name(), my_game.difficulty() --> #{my_game.name()}, #{my_game.difficulty()}"
请参见此处的示例:


请注意,我们如何不再接受initialize now中的参数。我们可以依靠主干在模型中设置适当的属性,因为我们现在在创建游戏时传入一个对象。为了检索这些值,我们只需定义方法
@get'propname'

好的,非常感谢。我怀疑是语法错误。我在Backbone.js文档中没有看到这一点,我将再次查看。语法错误在javascript中不会有堆栈跟踪。如果出现语法错误,coffeescript将无法编译。这是区别的一种简单方法。如果CoffeeScript语法(initialize params)和Backbone.js语法(hash)的合并没有产生编译错误,那并不意味着它在语法上是正确的。多语言,而且不准确。