レコードのコレクションを取得してテンプレートに配置し、それらをレンダリング{{#each}}
して、最後の DOM ノードがレンダリングされるまで読み込みアイコンを表示したいと考えています。
私の問題は、更新/再描画される最後のDOMノードとしてレンダリングされた最後のアイテムで状態を照会/コールバックを起動する方法が見つからないことです。
私のHTMLファイルでは、次のようになります。
<template name="stuff">
{{#each items}}
<div class="coolView">{{cool_stuff}}</div>
{{/each}}
</template>
そして、クライアント側の JS ファイルで:
// returns all records of Stuff belonging to the currently logged-in user
Template.stuff.items = function () {
Session.set('loading_stuff', true);
return Items.find({owner: Meteor.userId()}, {sort: {created_time: -1}});
};
Template.stuff.rendered = function() {
// every time something new is rendered, there will have been loading of the DOM.
// wait a short while after the last render to clear any loading indication.
Session.set('loading_stuff', true);
Meteor.setTimeout(function() {Session.set('loading_stuff', false);}, 300);
};
Session 変数loading_stuff
は Handlebars ヘルパーでクエリされ、ロードしているクラスの名前が返されます (ローダー アイコン GIF 付き) true
。
私が厄介なことをする理由Meteor.setTimeout
は、テンプレートにレンダリングされたすべてのアイテムの後にTemplate.rendered
呼び出されるからです。そのため、まだロード中であることを再確認する必要がありますが、次のものをロードするか、すべてのレンダリングを終了するまでしばらく待ちます。loading_stuff
false
Meteor の適切な方法で、すべての DOM 更新 (特定のテンプレートまたはページ全体) の最後に確実にクエリ/コールバックを行うにはどうすればよいですか?
どうもありがとう。
編集
コールバックを使用したソリューションは部分的にしか機能しません:subscribe()
onReady()
テンプレートは、レンダリングが開始される前に複数回 (2 ~ 3 回) 呼び出されるように見えますが、テンプレートがレンダリングに依存するサーバーからデータが返された後です。これは、データのロードが「完了」しているが、DOM はまだレンダリング中であることを意味します。これを適切に行うMeteor.autorun()
ための信頼できるフックがどこかにあるかどうかを試してみます。それまでの間、私の最初の質問はまだ残っていると思います:
テンプレート/ページ全体のレンダリングがいつ終了したかを知るにはどうすればよいですか?
最終編集:
結局のところ、DOM の構造に基づいて、開発者は堅実な DOM を用意し、状態を確認したい要素に適切なコールバックをできるだけ適切にアタッチする必要があります。気候に逆らうような簡単なことのように思えるかもしれませんが、私にとっては、テンプレートの最終要素がレンダリングされたことを知る唯一の方法は、テンプレートの最後に特別な ID を持つ要素をレンダリングして、テンプレートの終わりを知らせることです。レンダリングして.livequery
コールバックをアタッチします。今後、この状態をチェックするためのより統一されたグローバルなサポートが Meteor に組み込まれることを願っています。