从方法调用回调中访问meteor Template.instance()。数据

时间:2016-03-30 21:07:33

标签: javascript meteor

我有一段代码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是否有反应?也许我应该以某种方式改变架构以使这些功能可以驻留在回调中?

1 个答案:

答案 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来简化这段代码。