当我在其中调用的集合更新时,为什么我的助手不会重新运行?

时间:2015-08-17 14:27:34

标签: javascript mongodb meteor meteor-helper minimongo

我有一个带视频播放器的模板。它使用助手从mongo文档中获取视频源。这是它的样子:

帮助者:

'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 个答案:

答案 0 :(得分:3)

至于你的第一个问题(在你的代码的评论中),如果你在任何时间点只有一个文档,那么findOne就会有一个更简单的方法:

var currentProject = Projects.findOne();

您可以简单地使用|| operator

而不是沉默的三元
//Always place the default on the right, since '' is falsey
return (currentProject.setup.player.item_loaded.url || '');

并且因为你使用find(或findOne除了它返回一个文档之外基本上是相同的东西)它总是被动的。如果文档发生更改,则Tracker计算将失效并且您的助手uses such a computation

  

在幕后,每个助手都会启动一个新的Tracker.autorun。当其反应依赖性发生变化时,将重新运行帮助程序。帮助程序依赖于它们的数据上下文,传递的参数以及在执行期间访问的其他被动数据源。

然而,正如评论中提到的apendua,你的助手会触发副作用(loadPlayer()) - 这通常被认为是一种不好的做法,因为助手与吸气剂非常相似:你只是期望它返回数据,而不是改变任何东西。您可能希望为此作业运行另一个Tracker computation