Необработанная ошибка типа с CoffeeScript и Backbone.js - PullRequest
0 голосов
/ 25 января 2012

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

Я что-то упустил, но не могу разобратьсячто ...

1 Ответ

2 голосов
/ 25 января 2012

Функции конструктора базовой модели ожидают объект словаря с ключами и значениями, которые будут установлены в этой модели. Вы не предоставили объект, а вместо этого предоставили 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', чтобы получить эти значения.

...