获取骨干模型中的属性

时间:2014-03-06 03:27:04

标签: backbone.js coffeescript

我有一个模型扩展Backbone.Model并且有一个名为'labels'的数组属性,默认情况下标签是空的,但稍后将在第二个函数中填充数据并在第三个函数中使用,但是我有问题访问'labels',这是我的代码

  class GroupTreatmentGraphModel extends Backbone.Model

    initialize: () ->

    defaults:
      type : 'bar'
      labels: []    
      yFormatter: (y) -> y + ' counts'
      xFormatter:(x) ->  
        for p,q of labels   <-- get error msg: ReferenceError: labels is not defined
          console.log "lp=#{p}, lq=#{q}"
        labels[parseInt(x)]

    setData: (cid, data) ->
      tmp=@get('labels')
      console.log "1. get series, label.length="+tmp.length        <-- works fine here
      series = _.find @get('series'), (item) -> item  .cid == cid
      series.setData(data)

      countDone = _.countBy @get('series'), (item) -> if item.get('data')? then 'done' else 'notdone'
      if countDone.done == @get('series').length
        @setLabels(data)      
        @set('done', true)

    setLabels: (data) ->
        lbl = []
        for k,v of data
          if typeof(v.z) isnt "undefined" <-- for example: k=0, v.x=0, v.z='hell..o,worm!'
            lbl[parseInt(v.x)] = v.z

        @set('labels', lbl)
        tmp = @get('labels') 
        console.log "label length="+ tmp.length  <-- works fine here

    sync: () ->
      callback = (err, response, cid) =>
        console.log err if err
        @setData(cid, response) if response

      series = @get('series')
      if series
        _.each series, (singleSeries) ->
          $.ajax
            cache: false
            type: 'GET'
            url: singleSeries.get('uri')
            dataType: 'json'
            error: (jqxhr) ->
              callback jqxhr, null, singleSeries.cid
            success: (response) ->
              callback null, response, singleSeries.cid

  return GroupTreatmentGraphModel

我的应用代码是:

graph = new GroupTreatmentGraphModel
  position: 2
  title: 'SM Total vs Success By Group-Treatment'
  series: [
    new SeriesData
      name: 'gtt'
      color: 'steelblue'
      uri: '/api/gtt'
    new SeriesData
      name: 'gts'
      color: 'lightblue'
      uri: '/api/gts'  
  ]

谢谢!

1 个答案:

答案 0 :(得分:0)

我不明白为什么你会在yFormatter中想要xFormatterdefaultsdefaults旨在为模型属性提供默认值,属性应来自JSON数据源,JSON用于普通数据,不支持函数,因此将函数放入defaults是一个奇怪的事情要做。

相反,在模型上创建方法:

class GroupTreatmentGraphModel extends Backbone.Model

  initialize: () ->

  defaults: ->
    type : 'bar'
    labels: { }

  yFormatter: (y) -> "#{y} counts"
  xFormatter: (x) ->  
    labels = @get('labels')
    for p,q of labels
      console.log "lp=#{p}, lq=#{q}"
    labels[parseInt(x)]

  #...

请注意其他一些变化:

  1. 您的defaults中有可变日期,因此您应该使用一个函数来确保您不会意外地共享引用。 defaults中的值被浅层直接复制到模型中,因此如果defaults中有数组或对象,则最终可能会有几个模型共享的完全相同的数组或对象。
  2. 您说for p,q of labels所以您的labels属性可能是对象而不是数组。因此labels: { }标签中的defaults function. OTOH you're saying [parseInt(x)] so maybe标签is supposed to be an array and your loop is supposed to be代表e,i代替标签。
  3. 我在yFormatter切换到字符串插值,很多人发现这比一堆引号和+符号更清晰。
  4. 由于labels是模型属性,xFormatter会将其作为@get('labels')访问。