0

私は Meteor で Iron-Router を使用しています。ユーザーが /foo/:routeID にアクセスするとき、到達する前に foo がロードされていることが重要です。ただし、時間内にロードされず、ページが不安定にレンダリングされることがあります。これらの時間がいつ発生するかについて、識別可能なパターンを把握することができませんでした。

foo がロードされた後にページが再レンダリングされるように変更すると、顕著な更新が行われます。foo オブジェクトがロードされたときにページがレンダリングされるようにしたいだけです。どうすればこれを作ることができますか?私の現在のルーティングは以下です。

this.route('foo', {
    path:'/foo/:routeID',
    layoutTemplate:'base',
    before: function() {
        foo = Foos.findOne({routeID:this.params.routeID});
        console.log('before');
        console.log(foo);
        Session.set('foo', foo);
    }
4

1 に答える 1

1

IronRouter を使用している場合、Before は常に実行されますが、常にブロックされるとは限らないため、何かに時間がかかる場合でも、他のコードの実行が早すぎる可能性があります。

コレクションがロードされていることを確認するには、.wait() を呼び出して、コレクションがロードされるまで、Meteor/IronRouter がテンプレートを表示したり、他の関連コードを実行したりしないようにする必要があります。

このようなものが動作するはずです:

this.route('foo', {
path:'/foo/:routeID',
layoutTemplate:'base',
before: function() {
    this.subscribe('foos').wait();
    foo = Foos.findOne({routeID:this.params.routeID});
    console.log('before');
    console.log(foo);
    Session.set('foo', foo);
}

foo のパブリッシュ関数も定義されていることを確認する必要があります(まだ自動パブリッシュをオフにしていない場合はオフにします)。

編集: さらに、セキュリティのために、すべてのユーザー/ルートがすべての Foo をダウンロードしてクライアント側でフィルタリングするのを防ぐために、パラメーターを指定してパブリッシュ/サブスクライブ関数を使用して、ヒットするたびにコレクション全体をダウンロードしないようにすることができますページ。

this.subscribe('foos', this.params.routeID).wait();
于 2013-11-13T21:27:55.720 に答える