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別のテンプレートでコレクションを更新するときにヘルパーが再実行されるようにするにはどうすればよいですか? を使用しているのでCollection.find()、すでに反応するべきではありませんか?

4

1 に答える 1

3

最初の質問 (コードのコメント内) については、ある時点でドキュメントが 1 つしかない場合は、次の方法ではるかに簡単な方法がありfindOneます。

var currentProject = Projects.findOne();

||デフォルト設定のための重い 3 進数の代わりに、単純にoperatorを使用できます。

//Always place the default on the right, since '' is falsey
return (currentProject.setup.player.item_loaded.url || '');

そして、使用するためfind(またはfindOne、1つのドキュメントを返すことを除いて基本的に同じものです)、常に反応します。ドキュメントが変更された場合、トラッカーの計算は無効になり、ヘルパーはそのような計算を使用します:

内部では、各ヘルパーが新しい Tracker.autorun を開始します。リアクティブな依存関係が変更されると、ヘルパーが再実行されます。ヘルパーは、データ コンテキスト、渡された引数、および実行中にアクセスされるその他のリアクティブ データ ソースに依存します。

ただし、apenduaがコメントで指摘したように、ヘルパーは副作用をトリガーします ( loadPlayer()) - ヘルパーはゲッターに非常に似ているため、これは一般的に悪い習慣と見なされます。何も変更せずにデータを返すことを期待するだけです。このジョブのために別のトラッカー計算を実行したい場合があります。

于 2015-08-17T14:47:35.953 に答える