2014-11-04 1 views
3

Я обновил свое приложение до Meteor 1.0 и обновил свой router.js, потому что не могу использовать .wait()anymore. Однако теперь моя не найденная страница появляется всего лишь секунду, пока не появится «реальная страница». Как я могу это исправить?Не найдена страница всплывает на секунду - Meteor - iron - router

Вот мой код:

this.route('gamePage', { 
     path: '/game/:slug/', 
     onBeforeAction: [function() { 
      this.subscribe('singlePlayer', this.params.slug); 
      var singlePlayer = this.data(); 
      if (singlePlayer) { 
       if (singlePlayer.upgrade) { 
        this.subscribe('upgrades', this.params.slug); 
       } 
      } 
      this.next(); 
     }], 
     data: function() { 
      return Games.findOne({slug: this.params.slug}); 
     }, 
     waitOn: function() { return [Meteor.subscribe('singleGame', this.params.slug)]} 
    }); 

Любая помощь будет принята с благодарностью.

+0

Какая версия железного маршрутизатора? Также: зачем использовать массивные (квадратные) скобки вокруг обратного вызова 'onBeforeAction'? Я еще не видел этот синтаксис. Тем не менее, я использовал только железный маршрутизатор 0.9.4. –

ответ

1

Попробуйте использовать вместо этого шаблон subscriptions.

this.route('gamePage', { 
    path: '/game/:slug/', 
    subscriptions: function() { 
     return Meteor.subscribe('singlePlayer', this.params.slug); 
    }, 
    onBeforeAction: function() {  
     var singlePlayer = this.data(); 
     if (singlePlayer) { 
      if (singlePlayer.upgrade) { 
       this.subscribe('upgrades', this.params.slug); 
      } 
     } 
     this.next(); 
    }, 
    data: function() { 
     return Games.findOne({slug: this.params.slug}); 
    }, 
    waitOn: function() { return [Meteor.subscribe('singleGame', this.params.slug)]} 
}); 

Тем не менее, важно, чтобы вы также включить loading плагин, чтобы воспользоваться в loadingTemplate.

Router.configure({ 
    loadingTemplate: 'loading' // general purpose loading template 
}); 

// built in plugin.. surprisingly not clearly specified in current docs, but you can dive in the code for plugins. 
// https://github.com/EventedMind/iron-router/blob/devel/lib/plugins.js 

Router.onBeforeAction('loading', { only: ['gamePage'] }); // only show loading for pages with subscriptions 

Router.map(function() { 
    this.route('gamePage',{ 
     //... your other options here .. 
     loadingTemplate: 'gamePageLoading', // game Page dedicated loading markup. 
    }); 
}); 

Там также this.ready() шаблон, если вы хотите, чтобы остаться на вашем onBeforeAction реализации.

this.route('gamePage', { 
    path: '/game/:slug/', 
    onBeforeAction: [function() { 
     this.subscribe('singlePlayer', this.params.slug); 

     if(this.ready()) { 
      var singlePlayer = this.data(); 
      if (singlePlayer) { 
       if (singlePlayer.upgrade) { 
        this.subscribe('upgrades', this.params.slug); 
       } 
      } 
      this.next(); 
     } else { 
      this.render('loading'); 
     } 

    }], 
    data: function() { 
     return Games.findOne({slug: this.params.slug}); 
    }, 
    waitOn: function() { return [Meteor.subscribe('singleGame', this.params.slug)]} 
}); 

Источник: https://github.com/EventedMind/iron-router/blob/devel/Guide.md#subscriptions

Я думаю, что это изменение было необходимо, потому что .wait модель рассматривалась как ненужные цепочки и склонен к (кодированию) ошибкам. Кроме того, явная обработка .next() при переопределении onBeforeAction теперь обеспечивает правильное время для этого крючка (и, вероятно, большинство, если не всех других крючков).

+0

Большое вам спасибо! :) – user3475602

 Смежные вопросы

  • Нет связанных вопросов^_^