5

varを変更し、Sessionを介して再サブスクリプションをトリガーする場合autosubscribe、「最新の」データがサーバーからダウンするまで待機するコールバックメカニズムはありますか?[1]

この要点を見ると、サブスクリプションの変更に応じてコレクションのコンテンツを時間の経過とともにログに記録するコードが表示されます。出力の関連セクション:

at Subscribed; comments are: first post on #1 - second post on #1 
at Flushed; comments are: first post on #1 - second post on #1 
at Subscription complete; comments are: first post on #1 - second post on #1 - first post on #2 - second post on #2

したがって、(a)呼び出した後でも.subscribe、(b)呼び出しMeteor.flush(c);のonReadyコールバック内にあります。.subscribeコレクションにはまだ古いデータがあり、3番目のケースでのみ「正しい」データがそこにあります。

私は、リアクティブテンプレート.observeが最終的に正しいデータを受け取り、物事が正しい状態に「落ち着く」ことを理解しています。しかし、私たちがまだそこにいないことを知る方法はありますか?

たとえば、ほとんどのmeteorサンプルアプリ(および私自身のアプリ)は、サブスクライブされたコレクションにデータが追加および削除されている間、(FOUCと同様に)少しぎくしゃくする傾向があります。サブスクリプションが「ロード中」であることがわかれば、これについて何かを行うことができます。

[1]明らかに、サーバー上のデータは絶えず変化していますが、要点でわかるように、私は(タイムアウトなしで)それが正しいポイントを見つけることができません。したがって、質問での「有効」の使用。

非常にシンプルで一般的なユースケース

madewithアプリを利用してください。最初にロードしたとき、データがネットワークに接続されてアプリが突然表示されるまで、アプリは登録されていないように見えます。

この理由は、Meteor.subscribe呼び出されたが、データがまだネットワークに接続されていないためです。ただし、テンプレートがデータが保留中であり、「読み込み中」のテンプレートを表示する必要があることを簡単に判断する方法はありません。madewithでは、データがロードされたときに実際に何かを実行しますが、これはコールバックであるため、通常の流星の方法(つまり、リアクティブコーディング)から抜け出します。

次のようなものを書くことができれば、はるかに良いでしょう(IMO)。

 {{unless apps_loaded}}{{> loading}}{{/unless}}

 Template.madewith.apps_loaded = function() { return !Apps.isComplete(); }
4

2 に答える 2

3

興味深い質問です。

新しいサブスクリプションについて通知を受ける適切な場所は、onReadyコールバックです。そこで発生するログには、常に新しいデータが含まれていることに注意してください。(a) と (b) でのチェックは役に立ちません。呼び出しsubscribeとサーバーからすべてのデータが到着するまでの間に遅延があるためです。

根底にある問題はonRemove、停止したばかりのサブスクリプションのデータが削除された後に実行される同等のコールバックがないことです。さらに、autosubscribeちらつきを避けるために、古いサブを停止する前に、意図的に新しいサブを開始します。

実際のユースケースは?テンプレートはクエリをスコープ内にあるデータに制限することもできるため、ほとんどの場合、このようなコールバックは必要ありません。あなたの例では、コメントをレンダリングするテンプレート ヘルパーは、セッション内の現在のコメントに対してのみクエリを実行する可能性がpost_idあるため、データベースに余分なコメントがあっても害はありません。このようなもの:

Template.post.comments = function () {
  return Comments.find({post_id: Session.get('post_id')});
};

autosubscribeこれにより、ユーザーが最後に閲覧した 3 つの投稿のコメントを購読するなど、一般的な機能よりも洗練された戦略が可能になります。または、各投稿の最初のいくつかのコメントを購読し、その投稿が選択されたときにのみ、投稿の完全なコメント セットを個別に購読します。

于 2012-05-30T04:44:41.333 に答える
0

私は流星パーティーに少し遅れて来たので、流星の機能が追加されたときの背後にある歴史を知りませんが、完全を期すために、テンプレートレベルのサブスクリプションと 'subscriptionsReady' を使用してこれを行うことが可能になりました:

[js]
Template.myTemplate.onCreated(function() {
  this.subscribe('myData');
});

[html]
<template name="myTemplate">
  <h2>my Template</h2>
  {{#if Template.subscriptionsReady}}
    // code to loop/display myData
  {{else}}
    <p>Please wait..</p>
  {{/if}}
</template>
于 2015-07-18T10:31:41.953 に答える