Почему мой помощник не запускается повторно, когда коллекция, которую я вызываю внутри, обновляется?

У меня есть шаблон с видеоплеером. Он получает источник видео из монго-документа, используя помощника. Вот как это выглядит:

Помощник:

'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 для этой работы.

Другие вопросы по тегам