如果我有一个带比较器的集合。 (在coffeescript中)
class Words extends Backbone.collection
comparator: (word)->
word.get('score')
如果我要更改,如何对集合进行排序 基础项目的得分。这个想法是 将此附加到列表视图中的项目 最低分始终在最高分。
我一直在手动调用集合上的sort 每次我改变一个实例,但这似乎没有 鉴于整个列表已排序,效率太高 有一个项目。
我或许可以尝试删除变异的项目 然后再添加一次。
有什么建议吗?
答案 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)