骨干集合保持模型变异的排序顺序

时间:2011-04-02 16:35:37

标签: javascript sorting backbone.js coffeescript

如果我有一个带比较器的集合。 (在coffeescript中)

class Words extends Backbone.collection
    comparator: (word)->
        word.get('score')

如果我要更改,如何对集合进行排序 基础项目的得分。这个想法是 将此附加到列表视图中的项目 最低分始终在最高分。

我一直在手动调用集合上的sort 每次我改变一个实例,但这似乎没有 鉴于整个列表已排序,效率太高 有一个项目。

我或许可以尝试删除变异的项目 然后再添加一次。

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

看起来渲染代码的效率非常低,原因很简单: DOM操作很昂贵。只要有可能,就应该操作DOM一次而不是几次。 JavaScript / CoffeeScript中的所有其他优化都是次要的。

这是一个显着的代码(来自关于ambertch回应的第二条评论的主要内容):

refresh: ->
    @list.listview("refresh")

appendWord: (word)->
    wv = new WordView({model: word}).render().el
    @list.append( wv )
    @refresh()

render: ->
    @list.html("")
    @model.each (word) => @appendWord(word)
    @refresh()

因此,在render上,首先清除列表的HTML;然后为每个单词清除列表的HTML 控件刷新!

我不熟悉jQuery Mobile,所以我不确定主要的惩罚是在append(在jQuery中)还是在listview('refresh')上引起的,但它很容易重写避免这两者的循环,并删除一些函数定义/调用开销:

render: ->
  html = []
  @model.each (word) ->
    html.push(new WordView(model: word).render().el)
  @list.empty().append(html)

现在您只有一个html二传手和一个refresh来电,而不是一个html二传手, n append来电,和 n + 1 refresh来电!

答案 1 :(得分:0)