Ruby on rails 3.1 CoffeeScript和Backbone.js出现未捕获类型错误
Rails应用程序、学习咖啡脚本和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
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)的合并没有产生编译错误,那并不意味着它在语法上是正确的。多语言,而且不准确。