在我的流星项目中,我有一个集合,我在其中放置了一些日志,我想在客户端的服务器上始终首先显示最新添加的日志。
我的日志集合在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});
});
在collection.js
文件夹中的lib
我有:
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
服务器方法从该作业工作者插入日志时,我会在我的日志表中看到客户端上的新条目,但是如果我更新的话,它不会被createdAt
,Hovewer排序在页面上,我看到日志集合按预期进行排序。
像这样:
页面重新加载前:
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
是否应该在插入后以某种方式汇总集合以使其在客户端上重新排序?
答案 0 :(得分:1)
您还需要在客户端上使用{},{sort: {createdAt: -1}}
。
instance.getLogsList = function(){
return logsList.find({},{sort: {createdAt: -1}});
};
我认为,由于客户端已经拥有数据并且新数据已从服务器修补到客户端,因此在刷新之前会以这种方式对其进行排序。