我有以下路由:
this.route('postsPanel', {
path: 'posts/:_id',
waitOn: function() {
return Meteor.subscribe('posts', this.params._id);
},
data: function () {
return Posts.findOne(this.params._id);
},
onAfterAction: function () {
// Changes to reactive variables based on this.params._id that implicitly affect DOM.
setTimeout(function () {
// JQuery code for manipulating affected DOM elements.
});
}, 0);
}
);
问题1: 如果没有超时功能,则在重建模板之前异步执行JQuery代码,并且无法访问/找到DOM元素。 我也尝试使用和不使用超时功能的渲染功能,甚至更大的延迟,它不起作用。
Template.postsPanel.rendered = function () {
setTimeout(function () {
// JQuery code to manipulate DOM.
}, 100);
}
DOM操作代码假设在哪里,如果我想在网站完全呈现之后进行,并且只是在用户看到它之前的那一刻?
问题2: 在模板内部帮助器中,我定义了一个方法getActivePost。在每个数据之后执行两次:调用Iron Router中的function()。这意味着它第一次执行,它为空并返回未定义的错误。我的解决方法是返回this.activePost? this.activePost:null; 如何在没有防御性编程的情况下实现这一目标?
Template.postsPanel.helpers({
getActivePost: function () {
return this.activePost;
},
我也尝试过:
Router.configure({
loadingTemplate: 'loading'
});
Router.onBeforeAction('loading');
它仍然不起作用。
幕后实际发生了什么?这些函数以这种方式调用:
在数据(到达)之后是否有任何函数被调用?在用户看到页面之前,我可以在哪里操作DOM并进行更多更改?如何实现模板助手实际等待数据?如何在数据到达后操纵DOM?
所有这些行为仅在刷新页面时出现。如果我通过href输入路线,一切都会正确执行。
提前致谢。
答案 0 :(得分:0)
您的waitOn
函数应该返回订阅的句柄,否则加载挂钩将无法正常运行。