【问题标题】:Iron Router data fires 3 timesIron Router 数据触发 3 次
【发布时间】:2014-08-22 01:59:05
【问题描述】:

我在 Router.Config 上使用加载模板设置了这条路线

Router.onBeforeAction('loading');
this.route('clients', {
    path: '/clients',
    template: 'clientsAll',
    waitOn: function () {
        return Meteor.subscribe('clientsAll');
    },
    data: function () {
        if (this.ready()) {
            console.log("Data");
            return Clients.find().fetch();
        }
    }
});

一切正常,它在渲染模板之前显示加载模板,但在日志上它显示数据被触发两次。

【问题讨论】:

    标签: meteor iron-router


    【解决方案1】:

    这是正常行为,data 像大多数路由方法一样在反应式计算中运行。

    在您的 data 方法中,您依赖于 this.ready(),它恰好是一个反应式数据源(它返回由 waitOn 返回的等待列表的状态)。

    所以基本上这就是发生的事情:

    • 您的数据方法被声明为计算,最初以 this.ready() 返回 false 运行。
    • 您等待的订阅将在未来某个时间准备就绪,因此 this.ready() 现在返回 true 并且您的 data 方法将重新运行。

    这不是问题,因为data 方法通常计算量不大(它们只是返回一些在客户端本地可用的数据)。

    【讨论】:

    • 好的,我调试了脚本,它第一次运行了 3 次,就像你说的那样,它返回 false,所以日志上没有打印出来。然后第二次返回 true 并打印在控制台日志上,最后第三次也再次打印在日志上。
    • Clients.find().fetch() 也是反应式的(从集合中获得的游标是反应式数据源),也许这解释了第三次重新运行,试试 console.logging。
    • 我取出 Clients.find().fetch() 并让数据返回一个空数组,它仍然运行 3 次
    • 所以我摆脱了Router.onBeforeAction('loading');,数据现在只像预期的那样运行了两次。但我需要先显示一个占位符,否则它会呈现一个空模板,然后一秒钟后它会填充数据。我也试过在动作上做:但结果相同
    • @AndreEscudero,改变你的数据函数,让它只返回Clients.find().fetch()(在你的情况下真的需要调用 fetch 吗?),使用加载钩子并确保你提供一个loadingTemplate for路线 (this.route('clients', {path: '/clients', loadingTemplate: 'waiting'}))。
    猜你喜欢
    • 2015-11-30
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多