骨干视图未定义

时间:2013-07-05 00:24:55

标签: javascript json backbone.js coffeescript

我有这段代码 -

class TableManager 
  tables : {}
  tableViews :{}
  nextId : 0
  rootEl : 'body'
  addTable:(json,el)->
    newTableModel = new TableModel(json,@nextId)
    newTableModel
    @tables[@nextId] = newTableModel
    el = "#table1"
    newView = new TableView({model : newTableModel, columns : json["Columns"], el : el, id : @nextId})
    @tableViews[@nextId] = newView
    newTableModel.renderModel()
    @nextId++

class TableView extends Backbone.View
  tableId : ''
  columns : ''
  thead : ''
  tbody : ''
  input : ''
  rows : ''
  inputId : ''
  typingTimer : ''
  doneTypingInterval : 2000
  el : '#table1'
  initialize:()->
    @model.bind "render", @render 
    @tableId = "resultsTable#{@options.id}"
    @inputId = "filterInput#{@options.id}"
    @columns = @options.columns

  render:()=>
    console.log "EL"
    console.log $(@el)
    console.log @el

console.log @el始终未定义。我不知道为什么,我正在设置this.el我认为?是因为事件发生后调用了渲染吗?

1 个答案:

答案 0 :(得分:5)

实例化id="table1"时,DOM中没有TableView元素。例如,如果您在DOM中没有任何内容执行此操作:

class V extends Backbone.View
    el: '#no-such-element'
    render: => console.log @el

v = new V
v.render()

您将在控制台中获得undefined

演示:http://jsfiddle.net/ambiguous/ne39B/

如果您希望Backbone创建id="table1"元素,那么您需要使用不同的属性来告诉Backbone这样做; View#el documentation州:

  

this.el是根据视图的tagNameclassNameidattributes属性创建的,

所以你有一些选择:

  1. 创建视图时确保#table1在DOM中。
  2. 在实例化时将el传递给视图:v = new TableView(el: some_dom_object)
  3. 使用tagNameclassNameidattributes视图属性让Backbone为您构建适当的DOM元素。
  4. 此外,Backbone不会为您添加视图的el,即使Backbone构建视图el,您也必须自己将其添加到DOM中。