【发布时间】:2014-11-29 20:29:31
【问题描述】:
我有以下路由:
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 中的每个 data:function() 被调用之后执行两次。这意味着它第一次执行时,它是空的并返回未定义的错误。我的解决方法是返回 this.activePost ? this.activePost : null; 如何在没有防御性编程的情况下实现这一点?
Template.postsPanel.helpers({
getActivePost: function () {
return this.activePost;
},
我也试过了:
Router.configure({
loadingTemplate: 'loading'
});
Router.onBeforeAction('loading');
还是不行。
幕后究竟发生了什么?函数是这样调用的:
- 等待
- onAfterAction
- 数据(空)
- 渲染
- 数据(已到达)
有没有在数据(到达)之后调用的函数?在用户看到页面之前,我可以在哪里操作 DOM 并进行更多更改?如何实现模板助手实际等待数据?数据到达后如何操作DOM?
所有这些行为仅在刷新页面时出现。如果我通过 href 输入路由,一切都会正确执行。
提前致谢。
【问题讨论】:
标签: javascript jquery meteor iron-router meteor-blaze