Как автоматически сэкономить на изменениях в Backbone с помощью localalstorage? - PullRequest
1 голос
/ 23 декабря 2011

Код:

  class Session extends Backbone.Model
    initialize: ->
      @bind 'change', @save
      console.log 'init'
  class SessionList extends Backbone.Collection
    model: Session
    localStorage: new Store 'sessions'

  sessions = new SessionList
  a = new Session x: 'test'
  sessions.add a    
  console.log a.get 'x'
  a.set x: 'new'
  console.log a.get 'x'

При загрузке на страницу с помощью Backbone.localstorage консоль выдает:

init
test
Uncaught TypeError: Cannot read property 'localStorage' of undefined
  backbone-localstorage.js:70
Backbone.sync
_.extend.save
  backbone-localstorage.js:70
Backbone.Events.trigger
  backbone.js:304
_.extend.change
  backbone.js:117

А когда я закомментирую вызов @bind, я получаюожидается:

init
test
new

Я также могу успешно сохранить вручную после добавления a в sessions с вызовом a.save().

Полагаю, проблема в том, что конструктор Session вызывает событие change, а save() не знает, что делать, прежде чем a будет добавлен в sessions?Вместо этого я мог бы сделать что-то вроде этого:

class Session extends Backbone.Model
  set: (fields, ops) ->
    super fields, ops
    if (this has been added to a Collection)
      @save() 

Это лучший способ сделать это?Если да, как мне заполнить оператор if?

1 Ответ

3 голосов
/ 23 декабря 2011

Мое предложение будет просто позвонить сохранить вместо набора.поэтому замените это:

a.set x: 'new'

на

a.save x: 'new'

надеюсь, что это работает для вас

...