Pregunta

Es posible que esté utilizando un enfoque totalmente incorrecto para mi problema y, de ser así, dímelo.

La aplicación My Meteor recopila direcciones de correo electrónico y les envía por correo electrónico un enlace a una página de descarga con un token.Esta página de descarga es una ruta de Iron Router y el token es el ID de un elemento de una colección.Se verifica el uso previo del token y luego se iniciará una descarga [esa parte aún no está escrita].Entonces tengo esta ruta:

this.route('download', {
  path: '/download/:_id',
  template: 'capture_download',
  waitOn: function () {
    return Meteor.subscribe('captures');
  },
  data: function() { return Captures.findOne(this.params._id); }
});

Entonces necesito activar una llamada al método de mi servidor que realiza la verificación lógica tan pronto como se carga esta ruta.Y necesito el valor de ID para realizar esa llamada.Entonces tengo esto:

Template.capture_download.rendered = function(template) {
    Meteor.call('claimDownload', this.data._id, function(err, result) {
       // callback logic here
    });
}

Lo que no entiendo es que esto sólo funciona a veces.A veces la llamada se produce con el valor de ID correcto.Otras veces me sale:

Exception from Deps afterFlush function function: TypeError: Cannot read property '_id' of null

Entonces estoy pensando que mi evento de plantilla [renderizado] es incorrecto [no puedo encontrar en los documentos una lista de eventos de plantilla en ninguna parte], o que necesito hacer algo para esperar a que sea válido. this valor, o que mi enfoque es totalmente equivocado.¿Cómo solucionaría esta falta ocasional de datos en la vista cuando se renderiza?

¿Fue útil?

Solución

Usar onBeforeAction dentro de su ruta Iron Router, en lugar de una rendered método en la plantilla:

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
    });
  }
});

Ver https://github.com/EventedMind/iron-router/blob/dev/DOCS.md#before-and-after-hooks.Su "verificación del uso previo del token" se parece mucho al ejemplo de "verificar que el usuario haya iniciado sesión" en los documentos, que se resuelve con onBeforeAction.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top