使用sortBy与Backbone / Coffeescript的奇怪行为

时间:2013-10-14 07:20:45

标签: backbone.js coffeescript

我正在使用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, @
      @

然后一切正常。原始代码出了什么问题?

我尝试将排序功能移到另一个功能而没有任何改变。再次,当我想将已排序的集合分配给集合本身时,我得到了相同的错误。

有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

解决!

问题是重置事件会被触发两次。一个是Backbone,另一个是fetch。所以我第一次打电话

    @collection = @collection.sortBy (item) -> item.get('name')

它用空数组替换集合(因为还没有提取任何内容),因此在下次运行中没有sortBy方法被调用。

用以下代码替换该行:

  (@collection = @collection.sortBy (item) -> item.get('name')) if @collection.length > 0

解决了这个问题。