javascript - Meteor 集合从服务器更新,未在客户端上进行响应式(Reactive)排序

标签 javascript node.js mongodb meteor

在我的 meteor 项目中,我有一个集合,我在其中放置了一些日志,并且我想在客户端上始终在列表的第一个位置显示来自服务器的最新添加的日志。

我的日志集合是在autorun中订阅的,以控制限制加载的日志数量:

Template.statistics.onCreated(function(){
 instance.autorun(function () {

         var instance = this;

        instance.limitLogs = new ReactiveVar(20);
        instance.loadedLogs = new ReactiveVar(0);


        var limitLogs = instance.limitLogs.get();
        var subscriptionLogs = instance.subscribe("logs_list",limitLogs);


        // if subscription is ready, set limit to newLimit
        if (subscriptionLogs.ready()) {

            instance.loadedLogs.set(limitLogs);
        } else {
            console.log("> Subscription logs is not ready yet. \n\n");
        }

    });
    instance.getLogsList = function(){

        return logsList.find();
    };

});

Template.statistics.helpers({
     hasMoreLogs: function () {
     return Template.instance().getLogsList().count() >= Template.instance().limitLogs.get();
    } ,
    logs : function(){
           return Template.instance().getLogsList();

    }

});

在我的服务器上:

 Meteor.publish("logs_list",function(limit) {
        return  logsList.find({},{sort: {createdAt: -1}},{limit: limit});
    });

在我的 lib 文件夹中的 collection.js 中,我有:

logsList = new Mongo.Collection('logsList');

所以我有一些服务器代码作为作业在 JobCollection 中运行,从这个服务器方法我调用另一个服务器方法,该方法在日志中插入数据:

Meteor.Methods({
 logTask : function(taskId,message,status){
            logsList.insert({
                    jobID : taskId,
                    message : message,
                    status : status,
                    createdAt : new Date()
                }
            );
        } 
});

//... somewhere in job worker
  Meteor.call("logTask", job._doc._id, "something", "failed");

每当我使用 logTask 服务器方法从该作业 worker 插入日志时,我都会在客户端的日志表中看到一个新条目,但它不会按 createdAt 排序>,但是,如果我更新页面,我会看到日志集合按预期排序。

像这样:

页面重新加载之前:

message1    Wed Feb 24 2016 07:30:52 GMT+0200
message2    Wed Feb 24 2016 07:36:52 GMT+0200

页面重新加载后:

message2    Wed Feb 24 2016 07:36:52 GMT+0200
message1    Wed Feb 24 2016 07:30:52 GMT+0200

插入后是否应该以某种方式聚合集合以使其在客户端上重新排序?

最佳答案

您还需要在客户端上使用 {},{sort: {createdAt: -1}}

instance.getLogsList = function(){
    return logsList.find({},{sort: {createdAt: -1}});
};

我认为,由于客户端已经拥有数据并且新数据从服务器修补到客户端,因此在刷新之前以这种方式排序。

关于javascript - Meteor 集合从服务器更新,未在客户端上进行响应式(Reactive)排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35594147/

相关文章:

node.js - Mongoose 在数据库中查找最后十个条目

javascript - Uservoice 和 stackoverflow 共享 Flash 消息的通用 JavaScript 库?

javascript - 如何验证 vue.js 中的动态输入字段?

javascript - 将值恢复到 tokeninput 字段 - jquery 错误

node.js - 如何在 Asustor AS-302T NAS 上使用 NodeJS

mongodb - 有没有办法优化mongo中的自动完成关键字查询

javascript - 在处理简单 html 页面上的子元素时卡住了

node.js - 在生产环境(kubernetes)中启用 --inspect for nodejs 是个好主意吗?

node.js - 有没有办法在 morgan 中记录响应正文?

python - Pymongo $currentDate 对于存储无效