为什么我的模型未定义?

时间:2013-10-01 15:37:15

标签: backbone.js coffeescript

我的模型有些麻烦。当我去保存状态时,我得到了

  

未捕获的TypeError:无法调用未定义的方法'get'

有人有什么想法吗?我是Backbone的新手,甚至比Coffeescript更新。

View = require 'views/base/view'
module.exports= class TaskView extends View
  autoRender: true
  eventSounder:false
  taskRemoveTimeout:500

  completeTask:(e)=>
    e.preventDefault() if e
    e.stopPropagation() if e
    @toggleStatus()
    @model.save {
      status: @model.get('status') # error
    }, {
      success: =>
        unless @removeTaskTimeout
          @removeTaskTimeout = setTimeout(@removeTaskItem, @taskRemoveTimeout)
    }

  toggleStatus: =>
    if @model.get('status') is 'OPEN'
      if @removeTaskTimeout
        clearTimeout @removeTaskTimeout
        @removeTaskTimeout = null
      @model.set('status', 'CLOSED')
    else if @model.get('status') is 'CLOSED'
      @model.set('status', 'OPEN')

  removeTaskItem: =>
    if @model.get('status') is 'CLOSED'
      @eventSounder = true
      @datastore.userTasks.remove @model
      @model?.collection?.remove @model
      console.log @model

  getTemplateData: =>
    td = super
    td.completeClass = "complete" if @model.isComplete?()
    td.assignedBy = @datastore.dimensionUsers.getUserName(@model.get('assigner'))
    if !td.assignedBy
      td.assignedBy = "Dimension User Not Found"
    td

更新

以下是调用completeTask:

的事件的视图
View = require 'views/base/task'
template = require 'views/templates/fanview/right/task_carousel_item'

module.exports = class TaskCarouselItem extends View
  template: template
  template = null
  className: 'item'

  listen:
    'change model' : 'render'
    'toggleStatus model' : 'completeTask'

  attach: ->
    super
    id = @model.id
    @$el.data('id', id)
    @publishEvent 'taskCarousel:status:update'

  initialize: ->
    super
    console.log 'Initialize', @model

2 个答案:

答案 0 :(得分:0)

我对coffeescript语法不是很熟悉,但看起来@model.get('status')没有使用正确的this。要解决此问题,请尝试使用以下内容(但将其转换为coffeescript):

// Before @model.save
var status = this.model.get('status');
this.model.save ({
  status: status
});

答案 1 :(得分:0)

相信我们发现了这个问题。

当toggleStatus改变状态或其他什么时,模型上的其他地方可能有一个监听器。当模型发生变化(特别是状态)时,它会被破坏。因此,当completeTask继续时,模型已在此时被销毁。

感谢所有人的帮助,大家:)。