我有一段代码im meteor模板管理器:
"click #refuse": function() {
Meteor.call("removeUserFromEvent", this._id, Meteor.userId());
if (Template.instance().data.participants.length === Template.instance().data.orderedParticipants.length) {
Meteor.call("updateEventStatus", this._id, "ordered");
}
Router.go("/");
}
我想在if(...){...}
回调中执行Meteor.call(...)
个内容,例如
"click #refuse": function() {
Meteor.call("removeUserFromEvent", this._id, Meteor.userId(), function(){
if (Template.instance().data.participants.length === Template.instance().data.orderedParticipants.length) {
Meteor.call("updateEventStatus", this._id, "ordered");
}
});
Router.go("/");
}
但是,如果我尝试这样做,结果是回调内部Template.instance()
返回null
,我无法从模板中获取数据。
如何在方法回调中放置这些东西(我的意思是,获取一些当前状态参数并依赖于那些调用或不调用另一种方法)?也许Template.instance()。data是一个存储状态参数的错误位置? Template.instance.data是否有反应?也许我应该以某种方式改变架构以使这些功能可以驻留在回调中?
答案 0 :(得分:1)
这是一个事件处理程序和事件处理函数接受事件和模板作为'event target': function(event, template) {}
中的参数,因此您的代码可以修改为:
"click #refuse": function(evt,tmp) {
// get and cache your template data context references;
var participants = tmp.data.participants;
var orderedParticipants = tmp.data.orderedParticipants;
// this._id is not reliable, you should use Blaze.getData() on the event target
var _id = Blaze.getData(event.currentTarget)._id;
var userId = Meteor.userId();
// make sure your callback function accepts error and result
Meteor.call("removeUserFromEvent", _id, userId, function(err,res) {
if (err) {/* handle error */}
if (res) {
if (participants.length === orderedParticipants.length) {
Meteor.call("updateEventStatus", _id, "ordered", function(err,res) {
if (err) {/* handle error */}
if (res) {
// perhaps you would like to redirect to home after successful operation only
Router.go("/");
}
});
}
}
});
}
PS:这里有太多的回调,所以你可能想查看promises来简化这段代码。