2014-03-06 253 views
0

我有一个模型扩展Backbone.Model并有一个名为'labels'的数组属性,默认情况下标签是空的,但后来会填充第二个函数中的数据并用于第三个函数,但是I有问题访问 '标签',这里是我的代码在骨干模型中获取属性

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) -> 
     [email protected]('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' 
    ] 

谢谢!

回答

0

我不明白你为什么想要yFormatterxFormatterdefaults根本。 defaults旨在为模型属性提供默认值,并且属性意味着来自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属性可能是一个对象而不是数组。因此,defaults function. OTOH you're saying中的labels: { }标签[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')进行访问。