Почему мой помощник не запускается повторно, когда коллекция, которую я вызываю внутри, обновляется?
У меня есть шаблон с видеоплеером. Он получает источник видео из монго-документа, используя помощника. Вот как это выглядит:
Помощник:
'currentItemUrl' : function() {
//I only have one project. Is there a better/cleaner way to obtain it than the one below?
var currentProject = Projects.find().fetch()[0];
//the function below will create an instance of videojs or update the current one (set the new source)
loadPlayer();
//I return the source url if I have one
return currentProject.setup.player.item_loaded.url?currentProject.setup.player.item_loaded.url:"";
}
И HTML выглядит так:
<video id="video_player" class="video-js vjs-default-skin" controls preload="auto"
width = "{{videoWidth}}" height="videoHeight"
poster="{{currentItemPoster}}">
<source id="mp4" src="{{currentItemUrl}}" type='video/mp4' />
<source id="webm" src="" type='video/webm' />
<source id="ogg" src="" type='video/ogg' />
</video>
Вопрос
Как я могу убедиться, что мой помощник перезапускается при обновлении моего Projects
Коллекция в другом шаблоне? Так как я использую Collection.find()
разве это уже не должно быть реактивным?
1 ответ
Что касается вашего первого вопроса (в комментариях к вашему коду), если у вас есть только один документ в любой момент времени, тогда есть гораздо более простой способ findOne
:
var currentProject = Projects.findOne();
Вместо тяжелой троицы для дефолта вы можете просто использовать ||
оператор:
//Always place the default on the right, since '' is falsey
return (currentProject.setup.player.item_loaded.url || '');
И потому что вы используете find
(или же findOne
что в основном то же самое, за исключением того, что он возвращает один документ) он всегда будет реактивным. Если документ изменится, то вычисления в Tracker станут недействительными, и ваш помощник использует такие вычисления:
Под капотом каждый помощник запускает новый Tracker.autorun. Когда его реактивные зависимости меняются, помощник перезапускается. Помощники зависят от контекста данных, переданных аргументов и других реактивных источников данных, к которым обращаются во время выполнения.
Однако, как отметил Tomasz Lenarcik в комментарии, ваш помощник вызывает побочные эффекты (loadPlayer()
) - Это обычно считается плохой практикой, потому что помощник очень похож на геттер: вы просто ожидаете, что он вернет данные, а не изменит что-либо. Возможно, вы захотите запустить другое вычисление Tracker для этой работы.