Установите тайм-аут для layoutTemplate метеор/железо

Я изо всех сил пытался установить 3-секундный тайм-аут для моего loadingTemplate.

Использование кода ниже loadingTemplate отображается, но он перенаправляется на layoutTemplate через 3 секунды, как я ожидаю.

Пожалуйста, найдите ниже мой код и комментарии.

Я также развернул эту версию на 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
            }

        }

    }
});

person natali    schedule 02.12.2015    source источник
comment
Просто вернуть функцию ready() недостаточно. Есть несколько вопросов SO по этому поводу. Этот ответ кажется одним из самых простых подходов. Вы также можете найти это руководство. полезный.   -  person Michel Floyd    schedule 02.12.2015


Ответы (2)


Возврат из 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');
            }

        }

    }
});

Однако в вашем вопросе не совсем ясно, собираетесь ли вы это сделать.

person Ivan    schedule 02.12.2015
comment
Не сработало :( проверьте консоль в ns1-timeout.meteor.com, вы увидите, что вызывается повторно, и templateLayout не отображается через 3 секунды. Результат, который я ожидаю увидеть через 3 секунды, - это appLayout templateLayout согласно ns-timeout.meteor.com . У вас есть другие предложения? - person natali; 02.12.2015

После нескольких часов работы над этим я понял, что лучший способ установить собственное время ожидания для шаблона загрузки — не использовать 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;
   }
 }
};
person natali    schedule 03.12.2015