Метеоритная подписка не обновляется, несмотря на WaitOn
Я использую Iron Router. У меня есть RouterController, который выглядит примерно так:
var loggedInUserController = RouteController.extend({
layoutTemplate: "GenericLayout",
waitOn: function () {
return Meteor.subscribe("TheDataINeed");
}
});
И у меня есть определенный маршрут, который использует этот контроллер для ожидания 'TheDataINeed':
Router.route("/myapp", {
name: "Landing",
controller: loggedInUserController,
data: function () {
if(this.ready()){
return {content: "page-landing"};
}
}
});
Теперь проблема в том, что данные, на которые я подписан, условны: это означает, что в зависимости от роли пользователя я публикую разные данные, например:
if (!Roles.userIsInRole(this.userId, 'subscribed') ) {
return [
myData.getElements({}, { fields: { _id: 1, title: 1}, limit: 5 })
];
} else {
return [
myData.getElements({}, { fields: { _id: 1, title: 1} })
];
}
Когда роль пользователя не "подписана", я ограничиваю публикуемые данные 5 элементами.
Проблема заключается в том, что публикация не реагирует, поэтому, когда пользователь в первый раз меняет свою роль на "подписан" и я перехожу к своему маршруту ("/myapp"), пользователь все равно видит ограниченное количество элементов вместо всех.,
Есть ли способ вручную повторно активировать подписку, когда я загружаю этот маршрут? Если возможно, я бы хотел сделать это без добавления новых пакетов в мое приложение.
1 ответ
Не уверен насчет такого подхода, но вы можете попытаться установить значение сеанса в маршруте вместо кода подписки. Затем в файл на стороне клиента, где ваши подписки вы можете обернуть Meteor.subscribe("TheDataINeed")
в Tracker.autorun
и иметь сеанс в качестве параметра подписки. Каждый раз, когда значение сеанса изменяется, автозапуск перезапускает подписку и возвращает вам данные на основе нового значения.