【问题标题】:Uncaught type error with CoffeeScript and Backbone.jsCoffeeScript 和 Backbone.js 未捕获的类型错误
【发布时间】:2012-01-26 02:27:43
【问题描述】:

Rails 应用,学习 CoffeeScript 和 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()}"

我遗漏了一些东西,但无法弄清楚是什么......

【问题讨论】:

    标签: ruby-on-rails-3.1 backbone.js coffeescript


    【解决方案1】:

    主干模型构造函数需要一个字典对象,其中包含将在该模型上设置的键和值。您没有提供对象,而是提供了 2 个字符串。该错误是由于主干试图遍历对象引起的,但由于您不能合法地执行for (key in "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()}"
    

    在此处查看此示例:http://jsfiddle.net/NMkna/

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

    【讨论】:

    • 好的,非常感谢。我怀疑语法错误。我在 Backbone.js 文档中没有看到,我会再看一遍。
    • 语法错误在 javascript 中不会有堆栈跟踪。如果出现语法错误,coffeescript 将根本无法编译。这是区分差异的简单方法。
    • 如果 CoffeeScript 语法(初始化参数)和 Backbone.js 语法(哈希)的混合没有产生编译错误,这并不意味着它在语法上是正确的。多语言,不准确。
    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2012-12-29
    • 2014-12-07
    相关资源
    最近更新 更多