我的客户端订阅程序在我更新集合时没有刷新:
server/publish.js
我为客户订阅了两个集合发布,并在它获取所有数据时创建了一个会话对象,其中包含一些我需要的内容。 client/client.js
当更新成功时,客户端订阅应该在我的会话对象中创建一个新对象来更新,对吧?因为集合已经改变了,所以服务器上的发布应该刷新...但它没有刷新,我注释掉的
我不知道这是否是 Meteor 的行为,或者我漏掉了什么......我尝试更新传递给 publish 方法的参数
server/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/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')));
});
});
client/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});
};
client/views/home/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
}
});
},
当更新成功时,客户端订阅应该在我的会话对象中创建一个新对象来更新,对吧?因为集合已经改变了,所以服务器上的发布应该刷新...但它没有刷新,我注释掉的
// UNDEFINED
返回的是UNDEFINED
而不是我的新对象。我不知道这是否是 Meteor 的行为,或者我漏掉了什么......我尝试更新传递给 publish 方法的参数
decisionCursor
以强制更新,但什么也没发生: Session.set('decisionCursor', Session.get('decisionCursor'));
编辑:似乎如果我使用 Session.set('decisionCursor', Session.get('decisionCursor') + 1);
(注意+1),它会被刷新,但不是在 result 函数内部,如果我再点击一次,它会检测到新对象已添加......但我需要它在 result 函数内部刷新(在我的home.js
点击事件内部)