Использование загрузки шаблона в качестве триггера для серверного метода Meteor js

StackOverflow https://stackoverflow.com//questions/24026642

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top