Meteor发布订阅不是被动的

Rob*_*ter 3 javascript mongodb node.js 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 });
});
Run Code Online (Sandbox Code Playgroud)

我将我的客户端订阅到两个集合出版物,当它获取所有数据时,它会创建一个包含我需要的东西的会话对象.

客户机/ client.js

Meteor.startup(function () {
    SimpleSchema.debug = true;
    Deps.autorun(function () {
        Meteor.subscribe("decisions", Number(Session.get('decisionCursor')), function () {
            var decisionsVoted = {};
            Decisions.find({
                active: true
            }).forEach(function (decision) {
                var userVoted = Meteor.users.findOne({
                    "_id": Meteor.userId(),
                    "profile.votes.decision": decision._id
                }) != null ? Meteor.users.findOne({
                    "_id": Meteor.userId(),
                    "profile.votes.decision": decision._id
                }) : false;

                var ipVoted = Votes.findOne({
                    "ip": headers.get('x-forwarded-for'),
                    "votes.decision": decision._id
                }) != null ? true : false;
                if (ipVoted || userVoted)
                    decisionsVoted[decision._id] = {
                        voted: true,
                        blue: decision.blueTotal,
                        red: decision.redTotal,
                        bluePer: Math.round(decision.blueTotal * 100) / (decision.blueTotal + decision.redTotal),
                        redPer: Math.round(decision.redTotal * 100) / (decision.blueTotal + decision.redTotal)
                    };

            });
            Session.set('decisionsVoted', decisionsVoted);
        });
        Meteor.subscribe("decisionsToModerate", Number(Session.get('decisionCursor')));
    });
});
Run Code Online (Sandbox Code Playgroud)

客户端/ lib目录/ environment.js

activeDecisions = function() {
    var decisions = Decisions.find({active: true});
    console.log(decisions.fetch().length);
    return decisions;
};
moderateDecisions = function() {
    return Decisions.find({active: false});
};
Run Code Online (Sandbox Code Playgroud)

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

'click': function (event) {
    event.preventDefault();
    var decisionId = Session.get("selected_decision");
    var hasVoted = Session.get('decisionsVoted')[decisionId] ? Session.get('decisionsVoted')[decisionId].voted : false;

    Meteor.call("vote", decisionId, 'blue', hasVoted, function (error, result) {
        if (!error && result === true) {
            console.log(Session.get('decisionsVoted')[decisionId]); // UNDEFINED
        }
    });
},
Run Code Online (Sandbox Code Playgroud)

更新成功后,客户端subscriptioun应该更新在会话对象中创建新对象,对吧?因为集合已更改,所以刷新服务器中的发布...但它没有刷新,我评论的是,// UNDEFINED而不是返回我的新对象返回UNDEFINED

我不知道这是Meteor的行为还是我遗漏了一些东西......我试图更新传递给发布方法的参数decisionCursor以强制更新但是什么都没有Session.set('decisionCursor', Session.get('decisionCursor'));

编辑:似乎如果我使用Session.set('decisionCursor', Session.get('decisionCursor') + 1);(注意+1)它刷新但不在结果函数内,如果我再次点击它检测到新对象被添加...但我需要它在结果函数内刷新(在我的内部)home.js点击事件)

Jon*_*att 7

这篇(优秀)文章可能有所帮助.换句话说:

...在服务器上,Meteor的反应性仅限于Meteor.publish()函数返回的游标.这样做的直接后果是,与客户端不同,只要数据发生变化,代码就不会神奇地重新运行.