【问题标题】:IronRouter waitOn, data and onAfterAction messIronRouter waitOn、data 和 onAfterAction 乱七八糟
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多