铁路由器waitOn,数据和onAfterAction一团糟

时间:2014-10-05 10:22:02

标签: javascript jquery meteor iron-router meteor-blaze

我有以下路由:

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');

它仍然不起作用。

幕后实际发生了什么?这些函数以这种方式调用:

  • onWait
  • onAfterAction
  • 数据(空)
  • 呈现
  • 数据(到达)

在数据(到达)之后是否有任何函数被调用?在用户看到页面之前,我可以在哪里操作DOM并进行更多更改?如何实现模板助手实际等待数据?如何在数据到达后操纵DOM?

所有这些行为仅在刷新页面时出现。如果我通过href输入路线,一切都会正确执行。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您的waitOn函数应该返回订阅的句柄,否则加载挂钩将无法正常运行。