Использование загрузки шаблона в качестве триггера для серверного метода Meteor js
-
21-12-2019 - |
Вопрос
Возможно, я использую совершенно неправильный подход к моей проблеме, и если да, пожалуйста, сообщите мне
Приложение My Meteor собирает адреса электронной почты и отправляет им по электронной почте ссылку на страницу загрузки с токеном.Эта страница загрузки представляет собой маршрут железного маршрутизатора, а токен - это идентификатор элемента в коллекции.Токен проверяется на предмет предварительного использования, а затем будет инициирована загрузка [эта часть еще не написана].Итак, у меня есть этот маршрут:
this.route('download', {
path: '/download/:_id',
template: 'capture_download',
waitOn: function () {
return Meteor.subscribe('captures');
},
data: function() { return Captures.findOne(this.params._id); }
});
Итак, мне нужно запустить вызов моего серверного метода, который выполняет логику проверки, как только этот маршрут загружен.И мне нужно значение ID, чтобы совершить этот вызов.Итак, у меня есть это:
Template.capture_download.rendered = function(template) {
Meteor.call('claimDownload', this.data._id, function(err, result) {
// callback logic here
});
}
Чего я не понимаю, так это того, что это работает только иногда.Иногда вызов выполняется с правильным значением ID.В других случаях я получаю:
Exception from Deps afterFlush function function: TypeError: Cannot read property '_id' of null
Итак, я думаю, что либо мое событие шаблона [визуализировано] неверно [я нигде не могу найти в документах список событий шаблона], либо что мне нужно что-то сделать, чтобы дождаться действительного this
ценность, или что мой подход абсолютно неверен.Как бы мне исправить это случайное отсутствие данных в представлении при рендеринге?
Решение
Использование onBeforeAction
в пределах вашего маршрута Iron Router, а не rendered
метод в шаблоне:
this.route('download', {
path: '/download/:_id',
template: 'capture_download',
waitOn: function () {
return Meteor.subscribe('captures');
},
data: function() { return Captures.findOne(this.params._id); },
onBeforeAction: function() {
Meteor.call('claimDownload', this.params._id, function(err, result) {
// callback logic here
});
}
});
Видишь https://github.com/EventedMind/iron-router/blob/dev/DOCS.md#before-and-after-hooks.Ваша “проверка предварительного использования токена” очень похожа на пример “проверки того, что пользователь вошел в систему” в документах, который решается с помощью onBeforeAction
.