Meteor のドキュメントによると、Template.template_name.rendered に割り当てられたコールバックは、template_name の各インスタンスがレンダリングを終了した後に実行されます。この機能を使用して、テンプレートによって生成された DOM 要素に jQuery プラグイン (TagsManager や DotDotDot など) をアタッチしようとしています。これを行う「自然な」方法は次のようになります。
Template.template_name.rendered = function () {
var template = this;
var elem = $('input#tags'+template.data._id);
elem.tagsManager(); // doesn't work
}
ただし、これは機能しません。期待される動作が要素に関連付けられません。jQuery セレクターは適切に動作し、 の内部をログに記録するとtagsManager()
、イベント ハンドラーがアタッチされているように見えますが、.tagsManager()
終了後は何らかの形でアタッチされていません。
$(document).ready
コードを aまたは shortでラップする「通常の」ソリューションはsetTimeout
、まったく同じ動作に悩まされます。
Template.template_name.rendered = function () {
var template = this;
$(document).ready(function () {
window.setTimeout(function () {
var elem = $('input#tags'+template.data._id);
elem.tagsManager();
}, 100); // 0.1 seconds + $(document).ready doesn't work
});
}
setTimeout
3 秒など、非現実的に長い時間を与えることによってのみ、機能するようになりました。
Template.song.rendered = function () {
var template = this;
console.log("Template for "+template.data.title+" created");
$(document).ready(function () {
window.setTimeout(function () {
var elem = $('input#tags'+template.data._id);
elem.tagsManager();
}, 3000); // 3 seconds + $(document).ready works
});
}
実際のところ、elem.tagsManager()
単純なものに置き換えてもelem.on('click',...)
、上記と同じ動作に悩まされます-これが、Meteorの人たちが私たちTemplate.template_name.events
に . ただし、この種のプラグインはすべての興味深いプラグインを壊し、上記のようなハックで危険なコードに頼らざるを得なくなります。より良い方法はありますか?