流星奇怪的行为

时间:2014-05-20 21:23:27

标签: javascript node.js mongodb collections meteor

我正在测试Meteor的一些例程,我想知道这是正常活动还是我有错...

我将逐步描述:

我发布我的收藏品只是为了得到我想要的东西

服务器/ publish.js

Meteor.publish('decisions', function (decisionCursor) {
    return Decisions.find({ active: true }, { limit: 20, skip: decisionCursor });
});

Meteor.publish('decisionsToModerate', function (decisionCursor) {
    return Decisions.find({ active: false }, { sort: { createdAt: -1 }, limit: 1, skip: decisionCursor });
});

我将我的客户订阅到两个收藏出版物

的客户机/ client.js

Meteor.startup(function () {
    SimpleSchema.debug = true;
    Session.setDefault('decisionCursor', 0);
    Deps.autorun(function () {
        Meteor.subscribe("decisions", Number(Session.get('decisionCursor')));
        Meteor.subscribe("decisionsToModerate", Number(Session.get('decisionCursor')));
    });
});

我设置函数来检索两个集合,以防止每次调用查询...

的客户机/ LIB / environment.js

activeDecisions = function() {
    var decisions = Decisions.find({active: true});
    console.log(decisions.fetch().length); // PROBLEM HERE
    return decisions;
};
moderateDecisions = function() {
    return Decisions.find({active: false});
};

我创建了我的观看内容

的客户端/视图/家/ home.js

Template.home.activeDecisions = function() {
    var decisions = activeDecisions();
    return decisions;
};

正如您所看到的,在 client / lib / environment.js 上,我为您添加了一行,以查看我在哪里看到问题...

当我去http://localhost:3000/铁路线载荷时

this.route('home', {
    path: '/',
    layoutTemplate: 'masterLayout'
});

如果我使用Chrome控制台,就像我在 client / lib / environment.js 上写的那样,它应该返回一行包含多个Decisions文档,在这种情况下我只有3个有效决策,但Chrome输出:

0 environment.js?9868bbbef2024c202fd33213ed060f067dadbe75:3
3 environment.js?9868bbbef2024c202fd33213ed060f067dadbe75:3
3 environment.js?9868bbbef2024c202fd33213ed060f067dadbe75:3

三行,第一行告诉我,我有0个文件(什么?我有三个活动文件)接下来两行告诉我我想知道的是什么,我有三个文件。

我想要这个号码,因为我想在一个会话变量中设置它,每次调用该查询时都会更新它,因为如果我把它设置在其他地方(比如说Template.home.rendered)我会发出两个查询那会慢一点。

所以我看到的问题是,我不知道为什么Meteor写入控制台三次,如果我告诉它只写一次,当查询被解析为变量时...如果我设置会话它将为0 ,然后3然后3 ...这可能会导致一些错误?

1 个答案:

答案 0 :(得分:1)

模板助手形成一个反应性上下文 - 如果它们内部的反应变量得到更新,则助手将再次运行。因此,只要activeDecisions返回的光标得到更新,您就会看到该行被打印到控制台。

首次渲染模板时,函数打印0是完全合理的。请记住,在呈现模板之前,您订阅的文档可能尚未到达客户端。随着新文档的到达或更新,activeDecisions将再次进行评估。有关详细信息,请参阅我的blog post类似主题。

回到原来的问题,您可以将会话变量设置为光标数(BTW调用cursor.count()cursor.fetch().length更有效)。当该计数更新时,您的会话变量也将更新。因为会话变量是被动的,所以它的所有依赖关系将再次重新运行,等等。