2017-01-22 4 views
1

Я пытаюсь подписаться на список групп пользователей, включая дополнительную динамическую команду. Идентификатор последнего передается параметром для подписки, как это:Метеор, параметры динамической подписки

MeteorObservable.subscribe('user.teams', extraTeamId).subscribe(() => { 
    this.findUserTeams(); 
}); 

extraTeamId вар постоянно меняется на моей сервисной составляющей, и мне нужно, чтобы иметь эту динамичную команду на моей коллекции клиента каждый раз, когда это var изменяется.

Мой первый вопрос: если я изменю значение этой переменной на моем компоненте, должно ли публикация получать это новое значение или никогда не обновляется на сервере?

Если бы Метеор не должен был работать так, есть ли другие хорошие варианты?

Я также использую Angular2 для этого.

+0

Посмотрите на раздел Реактивные изменения в этой [ссылке ] (https://angular-meteor.com/tutorials/socially/angular2/search-sort-pagination-and-reactive-vars), я думаю, что он будет соответствовать вашим потребностям – Khang

+0

Спасибо за это, я не видел эту реализацию раньше, но мне понравилось! Возможно, я попробую простую версию этого. –

ответ

1

Если вы хотите получить новое значение, вам необходимо отказаться от подписки на последнюю подписку и снова подписаться на новые значения. вы можете сделать это так в угловом 2 метеоре.

на стороне сервера опубликовать

if (Meteor.isServer) { 
    Meteor.publish('user.teams', function(option : string) { 
       console.log(option); // you will get your dynamic param value in option 
       return findUserTeams.find({"team": option}); // apply your query here 
     }); 
    } 

и на стороне клиента, вы можете сделать что-то вроде этого.

 userteamdata: Observable <any[]> ; 
    userteamSub: Subscription; 

     this.userteamSub = MeteorObservable.subscribe('user.teams', extraTeamId).subscribe(() => { 
    this.userteamdata = findUserTeam.find({}).zone(); 
    }); 

теперь, когда ваше значение extraTeamId изменения вы можете обнаружить, что изменение и сделать что-то вроде этого

valuechangefunction(){ 

    if (this.userteamSub) { 
      this.userteamSub.unsubscribe(); 
      } 
     this.userteamSub = MeteorObservable.subscribe('user.teams', extraTeamId).subscribe(() => { 
      this.userteamdata = findUserTeam.find({}).zone(); 
      }); 
} 

я надеюсь, что это поможет :)

+0

Это хорошо, я пытался избежать этого (отписаться и подписаться снова), но я думаю, что это будет необходимо. Я подумываю использовать 2 подписки, одну с командами пользователей (возможно, их много) и сохранить эту подписку. Этот способ предотвратит накладные расходы на удаление и повторную отправку данных коллекции клиенту. И другая подписка будет только для дополнительной команды, эта будет отменять подписку и повторно подписываться каждый раз, когда она изменяется. Как вы думаете? –

+0

@HenriqueRotava Я думаю, что есть еще одно решение вашей проблемы, а не 2 подписки, которые вы можете добавить всей своей командой в один массив, и onchange добавить динамический идентификатор и в этот массив и искать все, используя запрос $ in mongdb. публикуйте все команды со стороны сервера. вот ссылка на запрос mondb, который вам понадобится. http://stackoverflow.com/questions/8145523/mongodb-find-by-multiple-array-items. –