0

次を使用して、時間通りに並べ替えを逆にしたいメッセージの単純なコレクションがあります(最新のものを上に)comparator

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

私の見解では、次のイベントを使用fetchします。add

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 に答える