0

我正在使用带有 Coffeescript 的 Backbone。我用于视图的代码是:

    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 集合进行排序时,我得到Uncaught TypeError: Object [object Array] has no method 'sortBy'错误。如果我更改渲染功能并将其重写为:

    render: ->
      sorted = @collection.sortBy (item) -> item.get('name')
      sorted.forEach @renderEntry, @
      @

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

我试图将排序功能移至另一个功能,但没有任何改变。同样,当我想将排序集合分配给集合本身时,我得到了同样的错误。

有任何想法吗?

提前致谢。

4

1 回答 1

0

解决了!

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

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

它用空数组替换集合(因为尚未获取任何内容),因此其中没有 sortBy 方法可以在下次运行时调用。

将行替换为:

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

解决了这个问题。

于 2013-10-15T07:00:00.180 回答