将超时设置为layoutTemplate流星/铁

Set timeout to layoutTemplate meteor / iron

本文关键字:流星 layoutTemplate 超时 设置      更新时间:2023-09-26

我一直在努力为我的loadingTemplate设置3秒的超时。

使用下面的代码loadingTemplate是呈现的,但它确实在经过3秒钟后重定向到layoutTemplate,正如我所期望的那样。

请在下面找到我的代码和评论问题。

我还将此版本部署到http://ns1-timeout.meteor.com/

我感谢你的帮助。

Router.configure({
    layoutTemplate: 'applayout',
    loadingTemplate: 'loading',
    waitOn: function () {
        var isTimePassed = false;
        var clock = 3;
        var timeLeft = function() {
            if (clock > 0) {
                clock--;
                Session.set("time", clock);
                console.log(clock);
            } else {
                console.log("That's All Folks");
                //return true
                isTimePassed = true;
                Meteor.clearInterval(interval);
                console.log('is Time passed: '+ isTimePassed);
                return isTimePassed; // seems it is being ignored
            }
        };
        var interval = Meteor.setInterval(timeLeft, 1000);
        return {
            ready: function () {
                console.log('return ready: ' + isTimePassed);
                return isTimePassed; // keeps the loading page and does not redirect to applayout if changed to false, loadingTemplate is not loaded and
            }
        }
    }
});

从setInterval返回不会有任何作用。您需要使用一个反应变量,并准备好返回该反应变量的值:

Router.configure({
    layoutTemplate: 'applayout',
    loadingTemplate: 'loading',
    waitOn: function () {
        Session.set('isTimePassed', false);
        var isTimePassed = false;
        var clock = 3;
        var timeLeft = function() {
            if (clock > 0) {
                clock--;
                Session.set("time", clock);
                console.log(clock);
            } else {
                console.log("That's All Folks");
                //return true
                isTimePassed = true;
                Meteor.clearInterval(interval);
                console.log('is Time passed: '+ isTimePassed);
                Session.set('isTimePassed', true);
            }
        };
        var interval = Meteor.setInterval(timeLeft, 1000);
        return {
            ready: function () {
                return Session.get('isTimePassed');
            }
        }
    }
});

然而,在你的问题中,这是否是你想要做的并不完全清楚。

经过几个小时的工作,我发现为加载模板设置自定义超时的最佳方法不是使用Router.configure。正确的方法是将对onBeforeAction函数的调用设置为my/route。因此代码结束如下:

Router.configure({
layoutTemplate: 'appLayout',
loadingTemplate: 'loading'
});
Router.onBeforeAction(function(){
   if(!Session.get('templateLoaded'))
   {
    setTimeOut(1000);
    this.layout('loading');
    this.render('loading');
   }
  else
  {
    this.render('home');
    this.next();
  }
}, 
{
   only: ['home']
});
var setTimeOut = function (timeout) {
var self = this;
self._ready = false
self._dep = new Tracker.Dependency();
Meteor.setTimeout(function () {
    self._ready = true;
    self._dep.changed();
    if(Meteor.isClient){
        Session.set('templateLoaded', true); // set session variable to true so applayout Template will be rendered
    }
}, timeout);
  return function () {
    self._dep.depend();
    return function () {
        return self._ready;
   }
 }
};