2016-03-30 4 views
1

У меня есть такой кусок кода менеджер им шаблон метеора:.Доступ метеора Template.instance() данные из вызова метода обратного вызова

"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() являются неправильным местом для хранения параметров состояния? Является ли Template.instance.data реактивным вообще? Может быть, мне нужно каким-то образом изменить архитектуру, чтобы такая функциональность могла находиться в обратном вызове?

ответ

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: Есть слишком много обратных вызовов здесь, так что вы можете посмотрите на обещания упростить этот код.

Смежные вопросы