在 Iron Router this.render() 之后访问 HTML
Access HTML after this.render() in Iron Router
我需要在新呈现的模板上应用一些语义 UI,但我不知道如何从路由器获取呈现的 HTML。这是我的代码:
Router.route('/', {
name: 'home',
where: 'client',
action: function () {
this.render('home');
},
onAfterAction: function () {
console.log( $('#homeSidebar') );
}
});
基本上,$('#homeSidebar')
应该 return 侧边栏元素,但是 return 没什么,因为 HTML 还不可用。到目前为止,唯一的解决方案是像这样更改函数
onAfterAction: function () {
setTimeout(function () {
$('#homeSidebarToggle').on('click', function () {
$('#homeSidebar').sidebar('toggle');
});
}, 200);
}
既不干净也不安全。如何在 HTML 可用后立即 运行 一个函数?
您可以查看 tracker.afterFlush 以在处理完所有无效计算后将代码安排到 运行。
但是您的具体示例看起来像是 jQuery 开发人员进入 Meteor 并直接应用 jQuery 模式的常见案例。通常在 Meteor 中有更简单的方法。
将事件处理程序附加到模板的更简单更好的方法是使用 template events。你的情况:
Template.home.events({
'click #homeSidebarToggle': function(ev){
$('#homeSidebar').sidebar('toggle');
}
});
您应该在模板上使用 onRendered
回调。 Meteor 使用模板 helpers, events and callbacks
来操作 DOM。 Iron Router 仅用于路由)
你的 client/view.html:
<template name="home">
<div id="homeSidebar">
</div>
</template>
你的client/view.js:
Template.home.onRendered(function () {
console.log($('#homeSidebar'));
});
我需要在新呈现的模板上应用一些语义 UI,但我不知道如何从路由器获取呈现的 HTML。这是我的代码:
Router.route('/', {
name: 'home',
where: 'client',
action: function () {
this.render('home');
},
onAfterAction: function () {
console.log( $('#homeSidebar') );
}
});
基本上,$('#homeSidebar')
应该 return 侧边栏元素,但是 return 没什么,因为 HTML 还不可用。到目前为止,唯一的解决方案是像这样更改函数
onAfterAction: function () {
setTimeout(function () {
$('#homeSidebarToggle').on('click', function () {
$('#homeSidebar').sidebar('toggle');
});
}, 200);
}
既不干净也不安全。如何在 HTML 可用后立即 运行 一个函数?
您可以查看 tracker.afterFlush 以在处理完所有无效计算后将代码安排到 运行。
但是您的具体示例看起来像是 jQuery 开发人员进入 Meteor 并直接应用 jQuery 模式的常见案例。通常在 Meteor 中有更简单的方法。
将事件处理程序附加到模板的更简单更好的方法是使用 template events。你的情况:
Template.home.events({
'click #homeSidebarToggle': function(ev){
$('#homeSidebar').sidebar('toggle');
}
});
您应该在模板上使用 onRendered
回调。 Meteor 使用模板 helpers, events and callbacks
来操作 DOM。 Iron Router 仅用于路由)
你的 client/view.html:
<template name="home">
<div id="homeSidebar">
</div>
</template>
你的client/view.js:
Template.home.onRendered(function () {
console.log($('#homeSidebar'));
});