1

我有一个带有视频播放器的模板。它使用助手从 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当我在另一个模板中更新我的集合时,如何确保我的助手重新运行?既然我使用了 a Collection.find(),它不应该已经是反应性的了吗?

4

1 回答 1

3

至于您的第一个问题(在代码的注释中),如果您在任何时间点只有一个文档,那么有一种更简单的方法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。当它的反应性依赖发生变化时,助手会重新运行。助手依赖于他们的数据上下文、传递的参数和其他在执行期间访问的反应数据源。

但是,正如apendua在评论中指出的那样,您的助手会触发副作用 ( loadPlayer()) - 这通常被认为是一种不好的做法,因为助手与 getter 非常相似:您只希望它返回数据,而不是更改任何内容。您可能希望为此作业运行另一个Tracker 计算。

于 2015-08-17T14:47:35.953 回答