0

我有一个简单的消息集合,我想按时反向排序(最新的在顶部),使用comparator

...
this.comparator = function(message) {
    var time = new Date(message.get("time")).getTime();
    return time;
}
...

在我看来,我使用fetchadd事件:

messages = new MessageCollection();
messages.fetch({update: true});
messages.on("add", this.appendMessage);

...

appendMessage: function(message) {
    var messageView = new MessageView({
        model: message
    });
    this.$el.prepend(messageView.render().el);
}

可悲的是,这些消息不是按照我要查找的顺序呈现的,而是按照它们来自服务器的原始顺序呈现的。

现在,经过一些测试,我发现当我一次添加所有消息时(使用reset),顺序与我预期的一样。

messages.fetch();
messages.on("reset", this.appendCollection);

...

appendCollection: function(messages) {
    messages.each(function(message) {
        this.appendMessage(message);
    }, this);
}

尽管我可以理解这个过程,因为一个集合可能只能在添加所有模型后才能弄清楚它应该如何排序,这个(on("add")配置)曾经在 Backbone 0.9.2 中工作。

我错过了什么吗?比较器方法或事件模型是否发生了变化add?还是我走错路了?谢谢!

4

2 回答 2

1

在“添加”的情况下,模型被插入到集合中的正确位置,正如“比较器”文档所应该的那样)。但是你正在做

this.$el.prepend(messageView.render().el);

这会将来自 MessageView 渲染的 html 放在 $el 的顶部(我假设它是 CollectionView 容器)。

保持 Html 尊重排序顺序的最佳方法是重新呈现集合视图,或滚动集合视图子项并将添加的 messageView 插入正确的位置(有点难做)。

于 2013-02-22T13:17:15.900 回答
1

appendMessage在集合中添加模型时调用方法。是appendMessage按照添加模型的顺序而不是集合中的实际顺序调用的。

于 2013-02-22T17:58:16.793 回答