tutorial started react publications learn guide español javascript meteor meteor-publications

javascript - started - meteor tutorial español



Meteor.publish: publicar colección que depende de otra colección (2)

Tengo una función de publicación de la siguiente manera:

Meteor.publish(''tasks'', function (name) { var project = Projects.findOne({name: name}); return Tasks.find({projectId: project._id}); });

Ahora suponga que en algún momento se realizan cambios en los Proyectos con el resultado de que Projects.findOne anterior devuelve un proyecto diferente y, por lo tanto, Tasks.find devolverá otras tareas. Sin embargo, los cambios realizados en Proyectos no vuelven a publicar las tareas

He usado reactivePublish, pero resulta que el paquete tiene problemas (y tampoco tiene pruebas de unidades). Entonces, ¿hay una manera fácil de volver a publicar esta función de publicación cuando el proyecto cambie?


Visión de conjunto

Al escribir estas líneas, las uniones reactivas son un problema sin resolver. Para una descripción completa, vea Reactive Joins In Meteor .

Recomendaciones

Recomiendo encarecidamente no utilizar observeChanges directamente. Es increíblemente difícil hacerlo bien y es fácil desarrollar una pérdida de memoria. Si no me crees, mira este video en EventedMind. Te hará sangrar los ojos.

Hay varias soluciones basadas en paquetes para este problema. La guía de meteoros recomienda publicar compuesto .

Si considera que la idea de utilizar una solución basada en paquetes es inaceptable, eche un vistazo a la sección Unirse en el cliente de Reactive Joins In Meteor . Está limpio pero requiere más espera por parte del usuario. También vea mi publicación en la plantilla se une si prefiere activar sus suscripciones en el nivel de la plantilla.


Ahora hay un niño nuevo en la cuadra. Una solución de publicación reactiva completa en el servidor . (Descargo de responsabilidad: soy uno de los autores.) Está diseñado para que pueda usarlo normalmente, como es de esperar con la autorun . Se ocupa de todo automáticamente.

Instale el paquete llamando a meteor add peerlibrary:reactive-publish .

Con el paquete agregado, puede simplemente hacer:

Meteor.publish(''tasks'', function (name) { this.autorun(function (computation) { var project = Projects.findOne({name: name}, {fields: {_id: 1}}); return Tasks.find({projectId: project._id}); }); });

Exactamente como es de esperar :-)

La parte importante es limitar los campos en la primera consulta solo a _id , de lo contrario la autorun volverá a ejecutar cada vez que cambie cualquier campo del documento de proyecto. No quieres eso.