javascript - 使用比较器的集合排序仅在获取完成后才起作用?

标签 javascript backbone.js

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

...
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 有关的事件模型是否发生变化?或者我的做法是错误的?谢谢!

最佳答案

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

关于javascript - 使用比较器的集合排序仅在获取完成后才起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15023130/

相关文章:

javascript - 有 requirejs 在加载模块时运行回调

javascript - 如何在一个 View 中获取多个集合

javascript - 如何在服务器上设置 "no value"以兼容Backbone?

backbone.js - 如何在 Backbone.js 应用程序中保存对我的本地数据的任何更改?

javascript - 对象的值未定义

javascript - v-else-if 在 vuejs : Failed to resolve directive: else-if 中不起作用

Javascript 获取页面源(服务器端)

javascript - 包含函数是否在其参数之前执行?

javascript - 在动态元素(Backbone)中调用ajax后,单击功能不起作用

javascript - 主干 - 在 jsfiddle 控制台中访问