我已经看了一段时间,我很确定它与无限回调循环有关。
我有一个方法,它从名为Sessions的集合中返回一个整数。以下是我的方法:
Meteor.methods({
going: function(sessionsId) {
return Sessions.update(sessionsId, {$addToSet: {participants: Meteor.userId()}, $inc: {slots:-1}});
},
retract: function(sessionsId) {
return Sessions.update(sessionsId, {$pull: {participants: Meteor.userId()}, $inc: {slots:1}});
},
sessionFull: function(sessionsId) {
var session = Sessions.findOne({_id:sessionsId});
console.log("gets here");
return session.slots;
}
});
然后在我的客户中我有:
if (Meteor.isClient) {
Template.hello.sessions = function () {
return Sessions.find();
};
Template.session.this_info = function () {
return this._id;
};
Template.session.isGoing = function() {
var session = Sessions.find({_id:this._id, participants:Meteor.userId()}).count();
if (session > 0) return true;
else return false;
};
Template.session.sessionFull = function() {
if (this.slots === 0) return true;
else return false;
};
Template.session.slotsMethod = function () {
Meteor.call('sessionFull',this._id, function(error, slots) {
Session.set("slots",slots);
});
return Session.get("slots");
};
Template.session.events({
'click input.going' : function () {
//Sessions.update(this._id, {$inc: {slots: -1}});
Meteor.call('going', this._id, function(error, updated) {
if (error)
return alert(error.reason);
});
},
'click input.retract' : function () {
Meteor.call('retract', this._id, function(error, removed) {
if (error)
return alert(error.reason);
});
}
});
所以我基本上有几个按钮可以增加或减少插槽字段,我希望有一个方法可以返回插槽字段包含的内容。这是我的模板:
{{#each sessions}}
{{> session}}
{{/each}}
<template name="session">
<br>
{{date_time}}, {{duration}}
{{#if isGoing}}
<input type="button" class="retract" value="not going/give slot" />
{{else}}
{{#if sessionFull}}
<h1>SORRY SESSION FULL</h1>
{{else}}
<input type="button" class="going" value="going/subract slot" />
{{/if}}
{{/if}}
{{participants}},{{sessionFull}},{{this_info}}
</template>
如果我尝试将Template.session.slotsMethod添加到我的模板(调用sessionFull Meteor方法),我会得到一个无限循环,因为它会为每个会话显示一个快速变化的整数。
我做错了什么?无法弄清楚,我认为它与回调/异步/同步有关但不确定。
答案 0 :(得分:1)
是的,您的Template.session.slotsMethod
会导致无限循环,因为Session
是被动的。
这就是:
Template.session.slotsMethod
将被调用,因为它依赖于Session.get("slots")
。Template.session.slotsMethod
本身也在更新Session.get("slots")
的值,因此该过程将重新开始。不太确定何时需要运行Template.session.slotsMethod
,但您可能希望将其分解为两部分,例如:
Template.session.getSlots = function () {
return Session.get("slots");
};
和
Meteor.call('sessionFull',this._id, function(error, slots) {
Session.set("slots",slots);
});
需要随时随地进行sessionFull
检查,可能在Template.session.rendered
?