我有一个模型扩展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'
]
谢谢!
答案 0 :(得分:0)
我不明白为什么你会在yFormatter
中想要xFormatter
和defaults
。 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)]
#...
请注意其他一些变化:
defaults
中有可变日期,因此您应该使用一个函数来确保您不会意外地共享引用。 defaults
中的值被浅层直接复制到模型中,因此如果defaults
中有数组或对象,则最终可能会有几个模型共享的完全相同的数组或对象。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代替标签。yFormatter
切换到字符串插值,很多人发现这比一堆引号和+
符号更清晰。labels
是模型属性,xFormatter
会将其作为@get('labels')
访问。