Iron Router: передача данных клиенту с помощью метеорного метода

В моем приложении используется железный маршрутизатор: когда пользователь попадает на определенный маршрут, содержащий подстановочный знак, я хотел бы использовать значение подстановочного знака для вызова метода метеора и использовать его возвращаемое значение для установки контекста данных для шаблона.

Пример:

Метеорный метод:

getUserName: function(id){
    return Meteor.users.findOne({_id: id}).profile.name;
}

Маршрутизатор:

data: function(){
        Meteor.call('getUserName', this.params.userId, function(error, result){

        });
    }

Метод метеора возвращает правильное значение, и я могу получить доступ к этому значению в функции обратного вызова. Но моя проблема в том, что я не знаю, как на самом деле использовать эти данные. Просто возврат из обратного вызова не работает.

Как правильно это сделать? Или вообще не идея вызывать метод Meteor в этом случае? Какая тогда альтернатива?

Большое спасибо за ваши ответы!


person tomet    schedule 12.09.2014    source источник


Ответы (1)


Вы можете обновить представление, используя этот подход:

Meteor.call("getUserName",this.params.userId,  function(error,result){
  if(error)  {
    throw new Error("Cannot get userName");
    return;      
  }

  Session.set("userName",result)
})

Вид:

Template.template_name.helpers({
  userName:function(){
    return Session.get("userName");
  }
})

Если пользователь изменит свое имя, то описанный выше метод не будет обновлять userName до тех пор, пока пользователь снова не откроет маршрут.

Однако я думаю, что лучший способ — использовать реактивность с методологией публикации/подписки метеора. В приведенном ниже решении userName будет обновляться всякий раз, когда оно будет меняться в монго.

Router.onBeforeAction('loading');

this.route("someRoute", {
   waitOn:function(){
     return Meteor.subscribe("getUser",this.params.userId);
   },
   data:function(){
      var user = Meteor.users.findOne({_id: this.params.userId});
      var userName = user && user.profile && user.profile.name;
      return{
        userName: userName
      }
   }
})

И на сервере:

Meteor.publish("getUser",function(userId){
  return Meteor.users.find(userId,{fields:{profile:1}});
})

В шаблоне someRoute вы отображаете userName, набрав:

{{userName}}
person Kuba Wyrobek    schedule 12.09.2014