我正在使用Backbone和Coffeescript。我用于观察的代码是:
initialize: ->
@collection.on "reset", @render, @
@collection.fetch({reset: true})
render: ->
@collection = @collection.sortBy (item) -> item.get('name')
@collection.forEach @renderEntry, @
@
renderEntry: (model) ->
v = new App.Views.EntryView({model: model})
@$el.append(v.render().el)
问题是当我想在渲染功能的第一行上对Backbone集合进行排序时,我得到未捕获TypeError:对象[object Array]没有方法'sortBy'错误。如果我更改渲染功能并将其重写为:
render: ->
sorted = @collection.sortBy (item) -> item.get('name')
sorted.forEach @renderEntry, @
@
然后一切正常。原始代码出了什么问题?
我尝试将排序功能移到另一个功能而没有任何改变。再次,当我想将已排序的集合分配给集合本身时,我得到了相同的错误。
有什么想法吗?
提前致谢。
答案 0 :(得分:0)
解决!
问题是重置事件会被触发两次。一个是Backbone,另一个是fetch。所以我第一次打电话
@collection = @collection.sortBy (item) -> item.get('name')
它用空数组替换集合(因为还没有提取任何内容),因此在下次运行中没有sortBy方法被调用。
用以下代码替换该行:
(@collection = @collection.sortBy (item) -> item.get('name')) if @collection.length > 0
解决了这个问题。