Я не поклонник делать что-либо в помощниках, у которых есть побочный эффект, например, переход на сервер. помощник может вызываться несколько раз, пока шаблон активен, поэтому imho это действительно ничего не значит, как вернуть значение.
в вашем случае, как минимум, я бы привязал подписку к шаблону, поэтому подписка исчезнет, когда шаблон будет уничтожен. например
Template.foo.helpers({
objects() {
Template.instance().subscribe('objectsSub',this.someContextAttribute);
return ObjectsCollection.find({});
},
});
более вероятно, я бы справиться с этим «присоединиться» на стороне сервера, когда коллекция мастер (myContextSub) публикуется. но это только в том случае, если ожидается, что ведомая коллекция (objectsSub) не будет реактивной. (в публикации вы можете установить слушателей на добавленные и измененные события и добавить дополнительные поля к опубликованным объектам, т. е. данные из объектовSub).
Если объекты должны быть реактивными, тогда я, вероятно, обработаю подписку в onCreated() шаблона. на клиенте вы должны установить добавленный прослушиватель в основную коллекцию, а затем подписаться на соответствующую рабочую коллекцию по мере публикации элементов в основной коллекции. помощник мог бы просто сделать find(), как сейчас. например
Template.foo.onCreated(function() {
let self = this;
self.subscribe('myContextSub');
let cursor = MyContextCollection.find();
cursor.observe({
added: function(newDocument) {
// loop through the objects on newDocument, pulling out the context attributes to subscribe one or more times...
self.subscribe('objectsSub', someContextAttribute[s]);
},
changed: function(newDocument, oldDocument) {
// same as added
}
});
});
теперь рабыня помощник может быть проще:
Template.Foo.helpers({
myContext() {
return MyContextCollection.findOne();
},
objects() {
return ObjectsCollection.find({});
},
});
в этом 2-й пример, может быть, что это немного странно, это я использую находку() вместо этого findOne() вы» re, чтобы получить доступ к слушателям таким образом. поэтому, возможно, вам нужно будет проверить способ публикации или фильтрации на клиенте.
Если вы хотите придерживаться метода findOne(), то применяется такая же концепция: как только данные будут возвращены, вы можете изучить его и подписаться на то, что вам нужно для рабской коллекции.
Почему вы подписываетесь на помощника? Мне это кажется странным. Можете ли вы показать свой код? – zim
Я добавил небольшой фрагмент кода. Причина, по которой я подписываюсь в помощнике, заключается в наличии контекста данных, который я смогу использовать в аргументах подписки – EugVal
, я получаю то, что вы делаете. У меня есть пара мыслей, на которые я отвечу. – zim